如何使用 NewtonSoft Json.Net 将 Json 字典反序列化为平面类

Posted

技术标签:

【中文标题】如何使用 NewtonSoft Json.Net 将 Json 字典反序列化为平面类【英文标题】:How to deserialize a Json dictionary to a flat class with NewtonSoft Json.Net 【发布时间】:2013-03-23 02:55:24 【问题描述】:

我从我无法控制的服务中获得了类似的 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 字符串的实际示例页面的链接:Ninjablocks Rest API documentation with json samples

【问题讨论】:

【参考方案1】:

我不知道是否有办法使用 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
    );

【讨论】:

非常感谢,没想到会这样。不过,如果有人有使用 JsonConverter 的想法,我很想听听。

以上是关于如何使用 NewtonSoft Json.Net 将 Json 字典反序列化为平面类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.net Core Web Api 中默认使用 Newtonsoft.Json?

C#如何Json转字符串;字符串转Json;Newtonsoft.Json(Json.Net)

Newtonsoft.Json(Json.net) 的使用

使用 Json.NET (Newtonsoft) 将空数组从 JSON 转换为 XML

.NET(C#) Json.Net(newtonsoft)使用LINQ查询JSON数据

.Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json反序列化json示例教程