2017-12-28 42 views
1

JArray.Parse()를 통해 C# 개체에 일부 JSON 끝점을 deserialize하고 처리 방법이 확실하지 않은 스키마를 발견했습니다. 아래의 nUnavailResReasonsMap 객체는 동적 인 이름/값 쌍을가집니다. 나는라고하지만 '지고 JSON 변환, 아래 설정이 다른 SO 포스트 당Json Converter를 사용하여 Dictionary에 속성을 추가하십시오.

//Root Level 
public class QueueStats 
{ 
    public string Id { get; set; } 
    public string Operation { get; set; } 
    public VoiceIaqStats VoiceIaqStats { get ; set ; } 
} 

public class VoiceIaqStats 
{ 
    public int Id { get; set; } 
    public int EsdId { get; set; } 
    ... 
    public int NUnavailResources { get; set; } 
    public NUnavailResReasonsMaps NUnavailResReasonsMap { get ; set ; } 
    public int NWorkResources { get; set; } 
    public int NSelectedResources { get; set; } 
    ... 
    public int NSlaPercentageHighThreshold { get; set; } 
} 

[JsonConverter(typeof(QueueStatsConverter))] 
public class NUnavailResReasonsMaps 
{ 
    public Dictionary<string ,int > NUnavailResReasonsMap { get; set; } 
} 

: 이름 값은 모두 정수가 될 것입니다 :

{ 
    "id": "Customer Service", 
    "operation": "UPDATE", 
    "VoiceIAQStats": { 
     "id": 139, 
     "esdId": 139, 
     ... 
     "nUnavailResources": 2, 
     "nUnavailResReasonsMap": { 
      "4": 1, 
      "9": 1 
     }, 
     "nWorkResources": 0, 
     "nSelectedResources": 0, 
     ... 
     "nSLAPercentageHighThreshold": 0 
    } 
} 

을 그리고 여기 내 C# 개체입니다 위에 정의 된 사전에 값을 가져 오는 방법을 모르겠습니다.

public class QueueStatsConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType.IsClass; 
    } 

    public override bool CanWrite => false; 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var instance = objectType.GetConstructor(Type .EmptyTypes)?.Invoke(null); 
     var props = objectType.GetProperties(); 

     var jo = JObject.Load(reader); 
     foreach (var jp in jo.Properties()) 
     { 
      //I can see the properties, but how do I add them to my existing dictionary? 
     } 
     return instance; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

이 방법을 사용할 수 있습니까? 아니면 접근 방식을 변경해야합니까?

+3

인가 NUnavailResReasonsMaps가 존재해야하는 이유가 있습니까? 사전 자체를 VoiceIaqStats에 넣을 수있는 것처럼 보입니다. – Dan

+1

다음과 같이 사전을'VoiceIaqStats'에 직접 넣으십시오 :'public class VoiceIaStats {public Dictionary NUnavailResReasonsMap {get; 세트; } ...}'그냥 작동해야합니다. [이름이 ID 인 JSON 객체에서 강하게 유형화 된 C# 객체 생성] (https://stackoverflow.com/q/34213566/3744182) 또는 [불법 C# 식별자를 일으키는 JSON 문자열을 구문 분석하려면 어떻게해야합니까?]를 참조하십시오. https://stackoverflow.com/q/24536533/3744182). – dbc

+0

네 - 그랬습니다, 도와 줘서 고마워. – slashNburn

답변

1

당신은 전혀 특별한 변환이 필요하지 않습니다, 단지 NUnavailResReasonsMaps 클래스를 제거하고 사용하십시오 Dictionary<int, int>을 대신 :

public class VoiceIaqStats 
{ 
    //snip 
    public Dictionary<int, int> NUnavailResReasonsMap { get; set; } 
    //snip 
} 

을 그리고 변환은 상자 밖으로 작동합니다

var result = JsonConvert.DeserializeObject<QueueStats>(json);