【发布时间】:2017-01-27 01:03:12
【问题描述】:
我是 json.net 的新手,因此我们将不胜感激。
我使用的是 json.net 的 net 2.0 版本,因为我需要将它集成到 Unity3d 引擎中 建议的答案(使用 nullvaluehandling)只是不起作用!我应该认为这是对最旧版本的限制吗?
所以,有一个像这样的对象:
Object ()
{
ChildObject ChildObject1;
ChildObject ChildObject2;
}
ChildObject ()
{
Property1;
Property2;
}
我希望 json.net 仅序列化所有对象(包括子对象)的非空属性。因此,如果我只实例化 ChildObject1 的 property1 和 ChildObject2 的 property2,则来自 JsonConvert 的字符串将是这样的:
{
"ChildObject1":
{
"Property1": "10"
},
"ChildObject1":
{
"Property2":"20"
}
}
但默认行为会创建这样的字符串:
{
"ChildObject1":
{
"Property1": "10",
"Property2": "null"
},
"ChildObject2":
{
"Property1": "null,
"Property2":"20"
}
}
我知道 NullValueHandling,但在我的情况下它不能正常工作!它只忽略父对象(我们正在序列化的对象)的空属性,但是如果这个父对象有一些子对象,它不会忽略这个子对象的空属性。我的情况不同。
如果子对象的一个属性不为空,它会将其序列化为一个字符串,其中一个非空属性,其他为空。
我的代码的UPD示例:
我有嵌套类
我的对象是这样的:
public class SendedMessage
{
public List<Answer> Answers { get; set; }
public AnswerItem Etalon {get; set;}
}
public class Answer ()
{
public AnswerItem Item { get; set; }
}
public class AnswerItem ()
{
public string ID { get; set; }
public bool Result { get; set; }
public int Number { get; set; }
}
我像这样实例化一个 SendedMessage 对象:
new SendedMessage x;
x.Etalon = new AnswerItem();
x.Etalon.Result = true;
比我用的
string ignored = JsonConvert.SerializeObject(x,
Formatting.Indented,
new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
它使这个字符串:
{ "标准具": {"ID" = "null", "Result" = "false", Number" = "null"}}
所以它确实忽略了 null 对象 Answers(一个 List),但不要忽略子对象的 null 属性。
感谢您的帮助!
【问题讨论】:
-
嗯,不,情况不同。 NullvalueHandling.Ignore 不忽略序列化对象的子对象的空属性。
-
你能分享一个minimal reproducible example你的问题吗?我相信
new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })应该递归地应用于所有对象级别。 -
我无法重现您的问题,
JsonSerializerSettings.NullValueHandling按预期工作。见dotnetfiddle.net/FpG0lk。
标签: c# json serialization json.net