Я собираю данные из веб-API, который возвращает сложную строку JSON. Это содержит значения многих разных типов, несколько массивов и некоторую довольно глубокую вложенность.
В настоящее время я преобразовываю строку в динамический объект:
dynamic dynamicObject = JsonConvert.DeserializeObject(jsonString);
Затем я извлекаю значения из этого объекта по мере необходимости и присваиваю их, но этот метод дает исключение с нулевой ссылкой, когда я пытаюсь получить массив:
int myValue = (int)dynamicObject.foo.value; // Works!
int[] myArrayOfInts = (int[])dynamicObject.bar.values; // Null
Я не уверен, как действовать, поскольку я довольно новичок в С# и ASP.net. Большинство решений, с которыми я сталкивался до сих пор, требуют создания небольших, строго типизированных классов, которые отражают всю структуру JSON. В моем случае было бы предпочтительнее просто использовать динамический объект, отчасти для простоты и отчасти потому, что на самом деле используются только определенные значения.
Когда я пытаюсь запустить ваш код, я получаю 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[]
.
Вы можете десериализовать массив, используя метод расширения 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());
}