Как десериализовать свойства JSON, содержащие числа, используя класс POCO? - PullRequest
0 голосов
/ 26 декабря 2018

Я практиковал десериализацию JSON с использованием JSONUtility в движке Unity. Я решил некоторые примеры с использованием класса POCO, когда свойства были строковыми, с помощью stackoverflow ( Link ). Я решил следующий JSON. Ссылка с использованием точных имен в классе POCO. Но когда свойства JSON содержат целые числа, подобные приведенным ниже.

{


"1": {
    "Armor": 1, 
    "Strenght": 1
  }, 
  "0": {
    "Armor": 1, 
    "Mana": 2, 
    "Strenght": 1, 
    "Health": 1, 
    "Power": 1
  }
}

Решение подобным образом не сработало. Из полученных отзывов ядолжен использовать словарь.

 IEnumerator GetExampleValues()
{
    string URLss = "http://www.json-generator.com/api/json/get/bOQGnptixu?indent=2";
    WWW readjson = new WWW(URLss);
    yield return readjson;

    Debug.Log("ReadJSON"+readjson.text);


}

Мой класс POCO ниже

using System.Collections.Generic;

[System.Serializable]
public class Exampleget  
{
    public int Power;
    public int Mana;
    public int Strenght;
    public int Armor;
    public int Health;

}

public class GetNumbers
{

    public List<Exampleget> onevalues;
}

1 Ответ

0 голосов
/ 26 декабря 2018

Одним из способов решения этой проблемы было бы использование атрибута JsonExtensionData

public class Exampleget  
{
    public int Power;
    public int Mana;
    public int Strenght;
    public int Armor;
    public int Health;

}

public class GetNumbers
{
    [JsonExtensionData]
    public Dictionary<string,dynamic> Values;
}

Теперь, когда класс установлен,

var str = @"{
        '1': {
            'Armor': 1, 
            'Strenght': 1
          }, 
          '0': {
            'Armor': 1, 
            'Mana': 2, 
            'Strenght': 1, 
            'Health': 1, 
            'Power': 1
          }
        }";

var result = JsonConvert.DeserializeObject<GetNumbers>(str);
foreach(var item in result.Values)
{
    Console.WriteLine($"For Key {item.Key},Power = {item.Value.Power}, Mana = {item.Value.Mana}, Armor = {item.Value.Armor}, Health = {item.Value.Health}");
}

Вывод

For Key 1,Power = , Mana = , Armor = 1, Health = 
For Key 0,Power = 1, Mana = 2, Armor = 1, Health = 1

Обновление

Если вы хотите использовать словарь как Dictionary<string,Exampleget> вместо динамического, вы можете использовать дополнительное свойство, которое выполняет преобразование в Exampleget.Но это требует дополнительной сериализации / десериализации, поэтому не рекомендую, если у вас нет веских причин придерживаться этого.

public class GetNumbers
{
    [JsonExtensionData]
    public Dictionary<string,object> Values;
    [JsonIgnore]
    public Dictionary<string,Exampleget> ExamplegetDictionary=> Values.Select(x=>new KeyValuePair<string,Exampleget>(x.Key, ((object)x.Value).Cast<Exampleget>()))
                                                                      .ToDictionary(x=>x.Key,y=>y.Value);

}

public static class Extension
{
    public static T Cast<T>(this object value)
    {
        var jsonData = JsonConvert.SerializeObject(value);
        return JsonConvert.DeserializeObject<T>(jsonData);
    }
}
...