使用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。事]'
答案 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,你可以获得你想要的任何灵活性。