我有一个包含json的JObject,其结构与我的Device类相同:
public class Entry
{
public string key { get; set; }
public object value { get; set; }
}
public class Detail
{
public List<Entry> entry { get; set; }
}
public class Device
{
public List<Detail> details { get; set; }
}
我将json存储为动态:
dynamic d = JsonConvert.DeserializeObject(json);
我想从动态对象创建一个设备对象:
new Device { details = d.details }
我不能简单地这样做,因为细节是一个包含列表的列表,并且必须使用构造函数创建列表,我无法弄清楚如何执行此操作。应该是这样的吗?
new Device { details = new List<Detail> ( entry = new List<Entry>(some list from d?))}}
请建议我。
编辑:
Json和我的对象不共享相同的结构,部分是这样,所以我不能简单地转换while json。
答案 0 :(得分:1)
如果您的JSON与Device
类具有完全相同的结构,那么您应该只能JsonConvert.DeserializeObject<Device>(jsonString)
。
即使原始JSON有更多属性,只要你的类具有相同的属性名称,并且数组是一个数组等,它应该可以工作。
样品:
public class Entry
{
public string key { get; set; }
public object value { get; set; }
}
public class Detail
{
public List<Entry> entry { get; set; }
}
public class Device
{
public List<Detail> details { get; set; }
}
void Main()
{
var json = @"
{
""irrelevant"": ""fnord"",
""also_irrelevant"": [1,3,5,7],
""details"": [
{
""not_entry"": true,
""entry"": [
{
""key"": ""x"",
""value"": ""1""
},
{
""key"": ""y"",
""value"": ""2""
}
]
},
{
""entry"": [
{
""key"": ""a"",
""value"": ""3"",
""bummer"": ""hello""
},
{
""key"": ""b"",
""value"": ""4"",
""bummer"": ""hello""
}
]
}
]
}";
Newtonsoft.Json.JsonConvert.DeserializeObject<Device>(json).Dump();
}
这在我的LINQPad中很好地运行,显示了结果的Device类,其中包含Detail类列表(2个条目),每个类都有一个Entry类列表(每个条目2个条目),并且设置了kvp。
如果可以,我会走这条路。如果出于某种原因关闭了属性的命名并且您无法更改它,则可以始终使用[JsonProperty("actual_json_name")]
覆盖它。