我有一个Json文档,我正在尝试获取从1到4的每个通道的Analog Input值。我试过这个代码:
JObject originalObject = JObject.Parse(testJsonObject);
var analogInputTrueValues = originalObject.Descendants().OfType<JProperty>().Where(p => p.Name == "DigitalInput").Select(x => x.Value).ToArray();
其中testJsonObject是由另一个方法加载的Json文件。
调试代码时,analogInputTrueValues的值为:
{Newtonsoft.Json.Linq.JToken[4]}
[0]: {13}
[1]: {13}
[2]: {14}
[3]: {14}
,这是正确的。但我感兴趣的是有一个数组或列表,如{"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();
工作示例:https://dotnetfiddle.net/tU5Mc8
使用强类型类的替代方法:https://dotnetfiddle.net/US4Bs0