Извлечение массива из JSON в ASP.net C #

1

Я собираю данные из веб-API, который возвращает сложную строку JSON. Это содержит значения многих разных типов, несколько массивов и некоторую довольно глубокую вложенность.

В настоящее время я преобразовываю строку в динамический объект:

dynamic dynamicObject = JsonConvert.DeserializeObject(jsonString);

Затем я извлекаю значения из этого объекта по мере необходимости и присваиваю их, но этот метод дает исключение с нулевой ссылкой, когда я пытаюсь получить массив:

int myValue         = (int)dynamicObject.foo.value; // Works!
int[] myArrayOfInts = (int[])dynamicObject.bar.values; // Null

Я не уверен, как действовать, поскольку я довольно новичок в С# и ASP.net. Большинство решений, с которыми я сталкивался до сих пор, требуют создания небольших, строго типизированных классов, которые отражают всю структуру JSON. В моем случае было бы предпочтительнее просто использовать динамический объект, отчасти для простоты и отчасти потому, что на самом деле используются только определенные значения.

Теги:
json.net

2 ответа

4
Лучший ответ

Когда я пытаюсь запустить ваш код, я получаю RuntimeBinderException: Cannot convert type 'Newtonsoft.Json.Linq.JArray' to 'int[]'. Вы можете сделать это преобразование с помощью ToObject.

dynamic dynamicObject = JsonConvert.DeserializeObject("{\"values\": [1, 3, 4]}");
int[] myArrayOfInts = dynamicObject.values.ToObject<int[]>();

Приведение в int работает, потому что преобразование каста определяется для многих типов, включая int, но не int[].

  • 0
    Спасибо, это дает желаемый результат.
2

Вы можете десериализовать массив, используя метод расширения ToObject<type> (где type - желаемый тип данных):

var jsonString = @"{ ""name"":""test"", ""array"": [""10"",""20"",""30"",""40""] }";
dynamic dynamicObject = JsonConvert.DeserializeObject(jsonString);
Console.WriteLine(((string)dynamicObject.name));
var items = dynamicObject.array.ToObject<int[]>();
foreach (var item in items)
{
    Console.WriteLine(item);
}

Выход:

test
10
20
30
40

Другая возможность заключается в том, чтобы JObject объект в JObject а затем извлечь массив как свойство - извлеченный объект автоматически имеет тип JToken, который позволяет итерации:

var array = ((JObject)dynamicObject)["array"];
foreach (var item in array)
{
    Console.WriteLine(item.ToString());
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню