4

我从我无法控制的服务中获得了类似的 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

4

1 回答 1

3

我不知道是否有办法用 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
    });
}
于 2013-04-01T23:28:10.923 回答