【问题标题】:When I serialize an object of a class with a enum property to JSON, if the value is null, the resulting json is borked当我将具有枚举属性的类的对象序列化为 JSON 时,如果值为 null,则生成的 json 是 borked
【发布时间】:2010-10-06 17:23:08
【问题描述】:

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

"controlType":"-2147483648"

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

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

【问题讨论】:

  • 这个问题的回答是否符合您的喜好?

标签: c# json enums


【解决方案1】:

当您有一个非空值时,下面的代码会为您提供 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?
【解决方案2】:

考虑:

echo json_encode(array("test"=>null));

这会产生:

{"test":null}

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

{"A":1, “乙”:2, “C”:3, 1:“一”, 2:“B”, 3:“C”}

这至少给了你双向性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多