C# 如何在JsonConverter WriteObject内部以编程方式构造对象
我试图在JsonConverter.WriteObject函数内部的航班上创建嵌套对象的结构 数据结构: 我做错了什么 有人能推荐一个编写自定义转换器的好指南吗C# 如何在JsonConverter WriteObject内部以编程方式构造对象,c#,json,json.net,C#,Json,Json.net,我试图在JsonConverter.WriteObject函数内部的航班上创建嵌套对象的结构 数据结构: 我做错了什么 有人能推荐一个编写自定义转换器的好指南吗 var container = new JObject(); var fi = e.PropertyA; JObject o = JObject.FromObject(fi); o.AddFirst(new JProperty("type", new JValue(fi.GetType().Name))); container.Ad
var container = new JObject();
var fi = e.PropertyA;
JObject o = JObject.FromObject(fi);
o.AddFirst(new JProperty("type", new JValue(fi.GetType().Name)));
container.Add(o);
这种方法失败了,只有一个例外
无法将Newtonsoft.Json.Linq.JObject添加到Newtonsoft.Json.Linq.JObject
如果我这样做
writer.WriteStartObject();
var fi = e.PropertyA;
JObject o = JObject.FromObject(fi);
o.AddFirst(new JProperty("type", new JValue(fi.GetType().Name)));
o.WriteTo(writer);
writer.WriteEndObject();
'处于ObjectStart状态的令牌StartObject将导致JSON对象无效。路径“源[0]”
答复
多亏了dbc,我才能够用下面的代码顺利完成
var container = new JObject();
var fi = e.PropertyA;
JObject o = JObject.FromObject(fi);
o.AddFirst(new JProperty("type", new JValue(fi.GetType().Name)));
container.Add(new JProperty("ObjectA", o));
container.WriteTo(writer);
根据定义,JSON对象是一组无序的名称/值对,因此在编写对象时,您需要在编写属性值之前执行以下操作:
writer.WritePropertyName("PropertyA");
o.WriteTo(writer);
类似地,将JObject
添加到JObject
时,需要将其嵌套在中以指定名称:
container.Add(new JProperty("PropertyA", o));
您得到的异常反映了这样一个事实,即您试图将PropertyA
值添加到JSON对象,而不首先指定其名称
正在显示两者。据我所知,Newtonsoft内置了序列化程序和反序列化程序。为什么不构建对象图,然后将其序列化为json对象?你正试图重新创造一些你随时可以得到的东西。此外,您在这里尝试的内容将更难阅读/维护/更新。祝你好运,但我建议使用现有的工具。根据JSON的定义,JSON对象是一组无序的名称/值对,因此在编写对象时,在编写属性值之前需要先执行以下操作。类似地,在向对象添加对象时,需要将其嵌套在中以指定名称。user7396598这是更广泛的技术问题的一部分。您可以在这里阅读我关于整个主题的另一个问题,有人能推荐编写自定义转换器的合适指南吗?--我认为这与堆栈溢出无关。但是,如果您希望向所有对象添加合成属性
“type”
,您可能会考虑使用自定义协定解析程序的建议。
container.Add(new JProperty("PropertyA", o));