2014-10-30 4 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 anks, это сработало. Является способ, которым я извлекаю значение AnalogInput хорошим способом? Есть ли лучший способ сделать это? – user843681

+0

Использование LINQ-to-JSON, как вы делаете, является правильным и хорошим. Альтернативным методом было бы создание строго типизированных классов, соответствующих вашему JSON, а затем использование 'JsonConvert.DeserializeObject()' для десериализации JSON в ваши классы. Это зависит от личных предпочтений. –

+0

Я добавил некоторые ответы на свой вопрос, чтобы вы могли сравнить разницу между этими двумя методами. Использование LINQ-to-JSON намного меньше кода, но некоторые люди находят, что строго типизированные классы легче работать. –

Смежные вопросы