使用Json.NET,如何将具有动态名称的对象列表解析为List?

Ric*_*ico 5 c# json json.net web

下面是我从外部API接收的JSON格式的示例:

"object": {
  "property_1": {
    "values": {
      "value": 1,
      "displayValue": "1"
    }
  },
  "property_5": {
    "values": {
      "value": 3,
      "displayValue": "3"
    }
  },
  "property_8": {
    "values": {
      "value": 1,
      "displayValue": "1"
    }
  },
  "property_14": {
    "values": {
      "value": 392,
      "displayValue": "392.0"
    }
  },
  "property_17": {
    "values": {
      "value": 14,
      "displayValue": "14"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有大约100种不同的属性类型可以发送,但它们都遵循相同的结构.唯一的区别是属性的名称("property_1","property_5"等).我没有尝试使用一长串不常用的属性来编写一个类,而是认为将它解析为一个对象列表会更有用,在结果类中使用属​​性名称,如下所示:

public class Property
{
    public string Name { get; set; }
    public PropertyValues Values { get; set; }
}

public class PropertyValues
{
    public double Value { get; set; }
    public string DisplayValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,属性名称("property_1","property_5"等)将分配给Property对象的Name字段.

如何使用Json.NET实现这一目标?

L.B*_*L.B 10

var result  = JsonConvert.DeserializeObject<Root>(json);
Run Code Online (Sandbox Code Playgroud)

你的模特在下面


public class Root
{
    public Dictionary<string, ValueWrapper> Object { get; set; }
}
public class ValueWrapper
{
    public PropertyValues Values { get; set; }
}

public class PropertyValues
{
    public int Value { get; set; }
    public string DisplayValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

BTW:Json.Net可以比@MatíasFidemraizer提出的更容易处理动态 ...

var val = ((dynamic)JsonConvert.DeserializeObject(jsonstring))
          .@object.property_14.values.value;

var val = ((dynamic)JsonConvert.DeserializeObject(jsonstring))
          .@object["property_14"].values.value;
Run Code Online (Sandbox Code Playgroud)

但是这种方法需要你知道property_14你的服务器会事先返回...