2014-10-30 26 views
0

我有一个JSON文件,我试图获得AnalogInput值从1到4 我已经尝试了这个代码的每一道:提取从JSON对象在C#中的值

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"} 
      ] 
     } 
} 

回答

2

你只需要包括ToString()Select表达x.Value后:

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

+0

Th它工作。我是如何提取AnalogInput值的一种好方法?有没有更好的方法来做到这一点? – user843681 2014-10-30 00:34:16

+0

使用LINQ-to-JSON,你正在做的方式是正确和好的。另一种方法是创建与您的JSON相对应的强类型类,然后使用JsonConvert.DeserializeObject()将JSON反序列化到您的类中。这归结于个人偏好。 – 2014-10-30 00:38:17

+0

我在回答中添加了一些小提琴,以便比较两种方法之间的差异。使用LINQ-to-JSON代码少得多,但有些人发现强类型的类更容易处理。 – 2014-10-30 00:57:42