当我将具有枚举属性的类的对象序列化为JSON时,如果该值为null,则生成的json被borked

6 c# enums json

当我将具有枚举属性的类的对象序列化为JSON时,如果该值为null,则生成的json字符串具有如下的名称值对:

"controlType":"-2147483648"
Run Code Online (Sandbox Code Playgroud)

当我将字符串反序列化为强类型对象时,这会导致问题.

处理枚举和空值的最佳方法是什么?

DMC*_*MCS 5

下面的代码为你提供了json =' {"Name":"Test","Id":1,"MyEnum":3} ',当你有一个非空值时.

        public enum SerializeObjTestClassEnum
    {
        one = 1, two, three, four
    }

    [Serializable]
    public class SerializeObjTestClass
    {
        public string Name { get; set; }
        public int Id { get; set; }
        public SerializeObjTestClassEnum MyEnum{ get; set; }
    }

    public void SerializeObject_Test_Basic_Object()
    {
        var obj = new SerializeObjTestClass { Id = 1, Name = "Test", MyEnum = SerializeObjTestClassEnum.three };
        var json = (new JavaScriptSerializer()).Serialize(obj);
    }
Run Code Online (Sandbox Code Playgroud)

此代码为您提供json =' {"Name":"Test","Id":1,"MyEnum":0} '

    var obj = new SerializeObjTestClass { Id = 1, Name = "Test" };
Run Code Online (Sandbox Code Playgroud)

注意枚举在未设置时是如何序列化为0,而枚举本身从1开始.这就是你的代码如何知道用于枚举的NULL值.

如果你想让json看起来像' {"Name":"Test","Id":1,"MyEnum":null} ',那么你需要通过使用类包装器来伪造它枚举.


the*_*art 0

考虑:

echo json_encode(array("test"=>null));
Run Code Online (Sandbox Code Playgroud)

这会产生:

{"test":null}
Run Code Online (Sandbox Code Playgroud)

处理枚举的最佳方法是使用键、值数组或 stdClass。只需将您的名字绑定到一组唯一的整数即可。然后你也可以绑定另一个方向:

{"A":1, "B":2, "C":3, 1:"A", 2:"B", 3:"C"}

这至少给你双向性。