如何在JsonConverter WriteObject内以编程方式构造对象

时间:2018-04-10 16:28:30

标签: c# json json.net

我正在尝试在JsonConverter.WriteObject函数内部的飞行中创建嵌套对象的结构。

数据结构:

Container 
    Object A 
    Object B

我做错了什么?

有人可以推荐编写自定义转换器的体面指南吗?

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中的Token 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);

1 个答案:

答案 0 :(得分:1)

根据JSON standard,JSON对象是无序的名称/值对,因此在编写对象时,您需要在编写属性值之前执行WritePropertyName()

writer.WritePropertyName("PropertyA");
o.WriteTo(writer);

同样,在向JObject添加JObject时,您需要将其嵌套在JProperty中以指定名称:

container.Add(new JProperty("PropertyA", o));

您获得的异常反映了这样一个事实:您试图将PropertyA值添加到JSON对象而不先指定其名称。

工作.Net fiddle同时显示两者。