C# 在C语言中从Json对象中提取值#

C# 在C语言中从Json对象中提取值#,c#,json,json.net,C#,Json,Json.net,我有一个Json文档,我正在尝试获取每个通道的AnalogInput值,从1到4。 我尝试过以下代码: JObject originalObject = JObject.Parse(testJsonObject); var analogInputTrueValues = originalObject.Descendants().OfType<JProperty>().Where(p => p.Name == "DigitalInput").Select(x => x.

我有一个Json文档,我正在尝试获取每个通道的AnalogInput值,从1到4。 我尝试过以下代码:

 JObject originalObject = JObject.Parse(testJsonObject);
 var analogInputTrueValues = originalObject.Descendants().OfType<JProperty>().Where(p => p.Name == "DigitalInput").Select(x => x.Value).ToArray();
,这是正确的。但我对数组或列表感兴趣,比如{“13”、“13”、“14”、“14”}。这是我无法前进的地方,因为我无法提取这些精确的值并将它们保存在列表或数组中。 即使我这样做:

digitalInputTrueValues.GetValue(0)
{13}
    base: {13}
    HasValues: false
    Type: String
    Value: "13"
我无法提取我感兴趣的值。 我如何绕过这类问题并提取所需的值? 我正在处理的对象如下:

{
        "module": {
            "serial": "3",
            "label": "A",
            "lat": "B",
            "long": "C",
            "channels": [
{"channel": "1", "label": "Channel 1", "AnalogInput": "13", "AnalogInputRaw": "13", "AnalogInputScale": "Raw", "DigitalInput": "Off"},
{"channel": "2", "label": "Channel 2", "AnalogInput": "13", "AnalogInputRaw": "13", "AnalogInputScale": "Raw", "DigitalInput": "On"},
{"channel": "3", "label": "Channel 3", "AnalogInput": "14", "AnalogInputRaw": "14", "AnalogInputScale": "Raw", "DigitalInput": "On"},
{"channel": "4", "label": "Channel 4", "AnalogInput": "14", "AnalogInputRaw": "14", "AnalogInputScale": "Raw", "DigitalInput": "On"}
            ],
            "variables": [
             {"1": "0"},
             {"2": "0"},
             {"3": "1"},
             {"4": "0"}
            ]
        }
}

只需在
x.Value
之后的
Select
表达式中包含
ToString()

JObject originalObject = JObject.Parse(json);
var analogInputTrueValues = originalObject.Descendants()
                                          .OfType<JProperty>()
                                          .Where(p => p.Name == "AnalogInput")
                                          .Select(x => x.Value.ToString())
                                          .ToArray();
JObject originalObject=JObject.Parse(json);
var-AnalogInputRueValues=originalObject.subjects()
第()类
.Where(p=>p.Name==“模拟输入”)
.Select(x=>x.Value.ToString())
.ToArray();
工作示例:


使用强类型类的替代方法:

谢谢,它很有效。我提取模拟输入值的方法是一种好方法吗?有更好的方法吗?使用LINQ到JSON,您正在使用的方法,是正确和良好的。另一种方法是创建与JSON对应的强类型类,然后使用
JsonConvert.DeserializeObject()
将JSON反序列化到类中。这取决于个人偏好。我在答案中添加了一些提琴,以便您可以比较这两种方法之间的差异。使用LINQ到JSON的代码要少得多,但有些人发现强类型类更容易使用。
JObject originalObject = JObject.Parse(json);
var analogInputTrueValues = originalObject.Descendants()
                                          .OfType<JProperty>()
                                          .Where(p => p.Name == "AnalogInput")
                                          .Select(x => x.Value.ToString())
                                          .ToArray();