2016-10-05 2 views
0

Я пытаюсь десериализовать этот файл JSON в объект, но я не могу заставить его работать.Json Deserialize Object crashing

Json:

"hotkeySets": { 
    "Player 1": { 
      "chatOff": [ 
        { 
        "actionsetting": { 
          "action": "Togglelist" 
         }, 
         "keysequence": "Ctrl+B" 
        }, 
        { 
         "actionsetting": { 
          "action": "Copy" 
         }, 
         "keysequence": "Ctrl+C" 
        }, 
        { 
         "actionsetting": { 
          "useObject": 3308, 
          "useType": "SelectUseTarget" 
         }, 
         "keysequence": "F10" 
        }, 
       ], 
       "chatOn": [ 
        { 
         "actionsetting": { 
          "action": "Select All" 
         }, 
         "keysequence": "Ctrl+A" 
        }, 
        { 
         "actionsetting": { 
          "chatText": "heal friend", 
          "sendAutomatically": true 
         }, 
         "keysequence": "Ctrl+F1" 
        }, 
        { 
         "actionsetting": { 
          "action": "Copy" 
         }, 
         "keysequence": "Ctrl+C" 
        }, 
       ] 
      }, 
      "Player 2": { 
       "chatOff": [ 
        { 
         "actionsetting": { 
          "action": "ToggleBattlelist" 
         }, 
         "keysequence": "Ctrl+B" 
        }, 
        { 
         "actionsetting": { 
          "action": "Copy" 
         }, 
         "keysequence": "Ctrl+C" 
        }, 
      } 
} 

А вот код, я использую для десериализации его:

JToken hotkeyConfig = JObject.Parse(json) 
JToken hotkeysSet = hotkeyConfig.SelectToken("hotkeySets"); 

var sets = JsonConvert.DeserializeObject<Dictionary<string, JObject>>(hotkeysSet.ToString()); 

foreach (var hotkeySet in sets) { 
    string hotkeySetName = hotkeySet.Key; // "Player 1" etc.. 
    List<Hotkey> hotkeys = new List<Hotkey>(); 

    foreach (var hotkey in hotkeySet.Value) { 

     Hotkey htk = JsonConvert.DeserializeObject<Hotkey>(hotkey.Value.ToString());  
    } 
} 

Но я могу получить объект Hotkey работать с Json десериализации. Я пробовал много вещей, и вот последний код, который я попробовал:

public class Hotkey { 

     [JsonProperty("actionsetting")] 
     public ActionSetting actionsetting; 

     [JsonProperty("keysequence")] 
     public string Shortcut { get; set; } 

     public class ActionSetting { 
      public int useObject{ get; set; } 

      public string chatText { get; set; } 

      public string useType{ get; set; } 

      public bool sendAutomatically{ get; set; } 
     } 
    } 

Это сбой в линии «JsonConvert.DeserializeObject», говоря, неверный формат, так что, возможно, я что-то в моей классовой структуре отсутствует I Угадай.

+0

Ваш код не компилируется. Что такое hotkeyConfig? Просто прочитав свой код, что-то не так? Почему вы вызываете десериализацию объекта столько раз, пока у вас есть только один файл JSON? Один вызов десериализации должен иметь возможность получить весь граф объектов. –

+0

Это просто Json.Parse(), это называется «множественным» временем, потому что клавиши «Player 1», «Player 2» и т. Д., Все они динамичны, поэтому необязательно они получат эти имена, это может быть любое имя и десериализация словаря - это то, как я нашел, чтобы получить это имя (рабочий), но когда я пытаюсь десериализовать значение, оно разбивается – Cartel

+0

Можете ли вы просто получить репрограмму, которая может компилироваться и запускаться? –

ответ

0

Прежде всего, в вашем файле Json есть ошибка. Вы не закрываете массив «chatOff» из «Player 2». Проверьте это ниже, где я закрыл его на линию до последнего:

"Player 2": { 
    "chatOff": [ 
     { 
      "actionsetting": { 
       "action": "ToggleBattlelist" 
      }, 
      "keysequence": "Ctrl+B" 
     }, 
     { 
      "actionsetting": { 
       "action": "Copy" 
      }, 
      "keysequence": "Ctrl+C" 
     }, 
    ] 
} 

Во-вторых, ваш подход к карте в Hotkey это хорошо, но вы не можете отобразить элементы массива непосредственно в классе Hotkey. В качестве альтернативы вы можете сопоставить новый объект для представления своего Игрока, а затем сопоставить свойства «chatOff» и «chatOn» в списках. Сделайте ваши классы JSon выглядеть следующим образом:

public class Player 
{ 
    [JsonProperty("chatOff")] 
    public List<Hotkey> ChatOff { get; set; } 

    [JsonProperty("chatOn")] 
    public List<Hotkey> ChatOn { get; set; } 
} 

public class Hotkey 
{ 
    [JsonProperty("actionsetting")] 
    public ActionSetting ActionSetting; 

    [JsonProperty("keysequence")] 
    public string Shortcut { get; set; } 
} 

public class ActionSetting 
{ 
    [JsonProperty("useObject")] 
    public int UseObject { get; set; } 

    [JsonProperty("chatText")] 
    public string ChatText { get; set; } 

    [JsonProperty("useType")] 
    public string UseType { get; set; } 

    [JsonProperty("sendAutomatically")] 
    public bool SendAutomatically { get; set; } 
} 

Последнее, сделать десериализации код выглядеть следующим образом:

var hotkeyConfig = JObject.Parse(json); 

var playersToken = hotkeyConfig.SelectToken("hotkeySets"); 

var playersDictionary = 
    JsonConvert.DeserializeObject<Dictionary<string, JObject>>(
     playersToken.ToString()); 

foreach (var playerEntry in playersDictionary) 
{ 
    var player = JsonConvert.DeserializeObject<Player>(playerEntry.Value.ToString()); 
} 
+1

Просто FYI, но вам не нужны все эти атрибуты JsonProperty. JSON.NET будет сопоставлять имена camelCase в JSON с именами PascalCase в классе .NET, если имена совпадают с регистром без учета регистра. Единственный раз, когда вам нужно 'JsonProperty', - если имена не совпадают. В противном случае они просто создают «шум». –

+0

Спасибо, он отлично поработал! – Cartel

+0

Несомненно, @CraigW. Я делаю это в основном для упрощения вещей на случай, если Картель захочет изменить имена свойств. – Ismael

0

Проверьте свою строку Json, формат плохой, как показывает ошибка. Здесь я даю вам правильный формат для строки Json, которую вы опубликовали.

{ 
"hotkeySets": { 
    "Player 1": { 
     "chatOff": [{ 
      "actionsetting": { 
       "action": "Togglelist" 
      }, 
      "keysequence": "Ctrl+B" 
     }, { 
      "actionsetting": { 
       "action": "Copy" 
      }, 
      "keysequence": "Ctrl+C" 
     }, { 
      "actionsetting": { 
       "useObject": 3308, 
       "useType": "SelectUseTarget" 
      }, 
      "keysequence": "F10" 
     }], 
     "chatOn": [{ 
      "actionsetting": { 
       "action": "Select All" 
      }, 
      "keysequence": "Ctrl+A" 
     }, { 
      "actionsetting": { 
       "chatText": "heal friend", 
       "sendAutomatically": true 
      }, 
      "keysequence": "Ctrl+F1" 
     }, { 
      "actionsetting": { 
       "action": "Copy" 
      }, 
      "keysequence": "Ctrl+C" 
     }] 
    }, 
    "Player 2": { 
     "chatOff": [{ 
      "actionsetting": { 
       "action": "ToggleBattlelist" 
      }, 
      "keysequence": "Ctrl+B" 
     }, { 
      "actionsetting": { 
       "action": "Copy" 
      }, 
      "keysequence": "Ctrl+C" 
     }] 
    } 
} 
} 

здесь является Json валидатор, где вы можете проверить его JsonValidator Я надеюсь, что это решит вашу проблему.