从动态对象创建对象
问题描述:
我有一个包含JSON具有相同的结构,我的设备类JObject:从动态对象创建对象
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和我的对象不共享相同的结构,这部分呢,所以我不能简单地转换,而JSON。
答
如果您的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,显示出得到的设备类,详细类(2个条目),每个条目类的列表的列表(各2个条目),以kvp的集合。
如果可以,我会走这条路。如果由于某些原因,属性的命名已关闭且无法更改,则始终可以使用[JsonProperty("actual_json_name")]
来覆盖它。
+0
它不完全一样,它共享相似性,它只是这个细节属性,我创建我的实际对象时遇到问题。 它在对象中的差不多1000个属性,所以我不能在这里发布它。 –
为什么不直接反序列化为条目?使用var entry = JsonConvert.DeserializeObject(string json); –
bedane
这不完全相同,它分享相似性,它只是这个细节属性,我创建我的实际对象时遇到问题。 它在对象中的差不多1000个属性,所以我不能在这里发布它。 –
你为什么使用'dynamic'?反序列化完整对象,无论它是具体类型。如果它们都包含'List',那么只需将一个属性的值分配给另一个属性即可。 –
Sinatr