自定义动态JSON反序列化

时间:2017-04-03 21:48:01

标签: c# json json.net deserialization json-deserialization

使用C#,反序列化动态JSON对象的正确方法是什么(即:一些JSON,其中单个键的类型可以在对象之间改变)?

例如,如果我有这个(完全有效)JSON:

{
  "stuffs": [
    { "content": "abcd" },
    { "content": "efgh" },
    { "content": [
        "ijkl",
        "mnop"
    ]}
  ]
}

其中thing可以是字符串或字符串数​​组,如果我定义了这些类,如何反序列化呢?

class ThingContainer {
  List<Thing> stuffs;
}

class Thing {
  List<string> content;
}

尝试反序列化I(预期)会遇到异常:

  

Newtonsoft.Json.JsonSerializationException :'无法将当前JSON对象(例如{“name”:“value”})反序列化为类型'System.Collections.Generic.List`1 [DummyProject。事]'

3 个答案:

答案 0 :(得分:0)

您的问题是您的C#类无法准确表示JSON。

你的JSON有一个对象,其中包含一个对象“stuffs”,它是一个对象列表,“content”是一个字符串列表。

C#类中包含的对象包含一个字符串列表对象。

您需要一个包含对象的对象,该对象是包含字符串列表的对象列表。

试试这个:

public class Content
{
    public List<string> Content { get; set; }
}

public class Stuff
{
    public List<Content> Contents { get; set; }
}

public class ThingContainer
{
    public List<Stuff> Stuffs { get; set; }
}

答案 1 :(得分:0)

我不知道C#中是否有任何解决方案,但我建议你改编你的JSON结构,如:

{
  arrayStuffs[
    { content: ['123', '456'] },
    // another arrays...
  ],
  stringStuffs{
    content: '',
    // another strings..
  },
  // another stuffs, and so on
}

并为您的所有内容定义模型:

public class arrayStuff{
  List<string> content;
}

答案 2 :(得分:0)

我不确定这是否可以通过NewtonSoft完成,但是如果你回到Windows.Data.Json中的内置API,你可以获得你想要的任何灵活性。