【发布时间】:2010-10-06 17:23:08
【问题描述】:
当我将具有枚举属性的类的对象序列化为 JSON 时,如果值为 null,则生成的 json 字符串具有如下名称值对:
"controlType":"-2147483648"
当我将字符串反序列化为强类型对象时,这会导致问题。
处理枚举和空值的最佳方法是什么?
【问题讨论】:
-
这个问题的回答是否符合您的喜好?
当我将具有枚举属性的类的对象序列化为 JSON 时,如果值为 null,则生成的 json 字符串具有如下名称值对:
"controlType":"-2147483648"
当我将字符串反序列化为强类型对象时,这会导致问题。
处理枚举和空值的最佳方法是什么?
【问题讨论】:
当您有一个非空值时,下面的代码会为您提供 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);
}
此代码为您提供 json = '{"Name":"Test","Id":1,"MyEnum":0}'
var obj = new SerializeObjTestClass { Id = 1, Name = "Test" };
注意枚举在未设置时如何被序列化为 0,而枚举本身从 1 开始。因此,您可以通过这样的代码知道枚举使用了 NULL 值。
如果您希望 json 看起来像 '{"Name":"Test","Id":1,"MyEnum":null}',那么您需要通过在 Enum 周围使用类包装器来伪造它。
【讨论】:
is Nullable<T>,将MyEnum替换为MyEnum?。
考虑:
echo json_encode(array("test"=>null));
这会产生:
{"test":null}
处理枚举的最佳方式是使用键、值数组或标准类。只需将您的姓名绑定到一组唯一的整数。然后你也可以绑定另一个方向:
{"A":1, “乙”:2, “C”:3, 1:“一”, 2:“B”, 3:“C”}
这至少给了你双向性。
【讨论】: