我从一个我无法控制的服务中得到类似的Json:
"SomeKey":
{
"Name": "Some name",
"Type": "Some type"
},
"SomeOtherKey":
{
"Name": "Some other name",
"Type": "Some type"
}
我正试图通过使用NewtonSoft Json将该字符串反序列化为。net类。Net在我的课程中工作得很好,现在看起来像这样:
public class MyRootClass
{
public Dictionary<String, MyChildClass> Devices { get; set; }
}
public class MyChildClass
{
[JsonProperty("Name")]
public String Name { get; set; }
[JsonProperty("Type")]
public String Type { get; set; }
}
然而,我更喜欢我的类的一个扁平版本,没有这样的字典:
public class MyRootClass
{
[JsonProperty("InsertMiracleCodeHere")]
public String Key { get; set; }
[JsonProperty("Name")]
public String Name { get; set; }
[JsonProperty("Type")]
public String Type { get; set; }
}
然而,我没有如何实现这一点的线索,因为我不知道如何访问像这样的自定义转换器中的键:
http://blog.maskalik.com/asp-net/json-net-implement-custom-serialization只是以防有人关心,链接到一个页面,其中实际示例的Json字符串我得到可以找到:带Json样本的Ninjablocks Rest API文档
我不知道是否有办法用JSON.NET做到这一点。也许你想太多了。如何创建一个单独的DTO类型来反序列化JSON,然后将结果投影到更适合您的领域的另一种类型?例如:
public class MyRootDTO
{
public Dictionary<String, MyChildDTO> Devices { get; set; }
}
public class MyChildDTO
{
[JsonProperty("Name")]
public String Name { get; set; }
[JsonProperty("Type")]
public String Type { get; set; }
}
public class MyRoot
{
public String Key { get; set; }
public String Name { get; set; }
public String Type { get; set; }
}
那么你可以这样映射:
public IEnumerable<MyRoot> MapMyRootDTO(MyRootDTO root)
{
return root.Devices.Select(r => new MyRoot
{
Key = r.Key,
Name = r.Value.Name
Type = r.Value.Type
});
}