2016-10-05 3 views
0

이 JSON 파일을 개체로 deserialize하려고하는데 작동하지 않습니다.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());  
    } 
} 

하지만 핫키 객체가 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

귀하의 코드는 컴파일되지 않는 JSON 클래스는 다음과 같이합니다. 단축키 설정이란 무엇입니까? 코드를 읽는 것만으로 뭔가 잘못 됐습니까? 하나의 JSON 파일을 가지고있는 동안 왜 객체를 여러 번 deserialize한다고 부르는가? deserialize를 한 번 호출하면 전체 객체 그래프를 얻을 수 있습니다. –

+0

"Player 1", "Player 2"등의 키가 모두 동적이기 때문에 Json.Parse()라고 불리우며 여러 번 호출됩니다. 따라서 반드시 그 이름을 가져올 필요는 없습니다. 어떤 이름, 그리고 사전 deserialize 내가 그 이름 (일하는)을 얻는 방법을 찾았지만, 내가 그것을 가치를 deserialize하려고 할 때 – Cartel

+0

당신은 우리가 컴파일하고 실행할 수있는 repro을 얻을 수 있습니까? –

답변

0

우선, Json 파일에 오류가 있습니다. "chat 2"의 "chatOff"배열을 닫지 않습니다. 내가 마지막 전에 라인에 닫힌 경우, 아래를 확인하십시오

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

둘째, 단축키로 매핑하는 접근 방식은 괜찮지 만, 당신은 단축키 클래스에 직접 배열 항목을 매핑 할 수 없습니다. 또는 새 객체를 매핑하여 플레이어를 나타내는 다음 "chatOff"및 "chatOn"속성을 목록에 매핑 할 수 있습니다.

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은 이름이 대소 문자를 구분하지 않는 한 JSON의 CamelCase 이름을 .NET 클래스의 PascalCase 이름에 매핑합니다. '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" 
     }] 
    } 
} 
} 

여기 당신이 그것을 JsonValidator 나는이 문제를 해결 희망을 테스트 할 수있는 JSON 유효성 검사기입니다.