Учитывая предоставленную JSON, мы не можем напрямую go для структуры Dictionary
, это потому, что у нас есть массив объектов, где у каждого объекта есть имя Statistic
в качестве имени свойства (в то время как это должно быть значением свойства с именем Name
)
Чтобы избежать работы с пользовательскими конвертерами, вот быстрое (не готовое к производству!) решение, которое может дать вам хорошую отправную точку. Идея состоит в том, чтобы десериализовать его как dynamic
, затем извлечь объект statistics
как JArray
и построить оттуда структуру результатов.
Обратите внимание, что я ничего не проверяю на ноль, так что это работает, пока вход правильно сформирован (вам нужно Newtonsoft.Json
от NuGet).
using System;
using System.Linq;
using Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace StackOverflow
{
internal class Program
{
private static readonly string _inputJson =
@"
{
""statistics"": [
{
""Strength"": {
""min"": 16,
""max"": 20
}
},
{
""Dexterity"": {
""min"": 16,
""max"": 20
}
}]
}
";
private static void Main(string[] args)
{
var tempObject = JsonConvert.DeserializeObject<dynamic>(_inputJson).statistics as JArray;
var result = new Container
{
Statistics = tempObject.Select(obj =>
{
var token = obj.First as JProperty;
var stats = token.Value;
return new Statistic
{
Name = token.Name,
Min = Convert.ToInt32((stats["min"] as JValue).Value),
Max = Convert.ToInt32((stats["max"] as JValue).Value)
};
}).ToArray()
};
foreach (var stat in result.Statistics) Console.WriteLine($"{stat.Name} = ({stat.Min}, {stat.Max})");
}
}
}
namespace Models
{
public class Container
{
public Statistic[] Statistics { get; set; }
}
public class Statistic
{
//Contains the name of the statistic
public string Name { get; set; }
public int Min { get; set; }
public int Max { get; set; }
}
}
Это вывод, который я получаю:
Сила = (16, 20)
Ловкость = (16, 20)