2017-09-14 7 views
0

내 페이로드는 다음과 같이 보일 것입니다 :C# JSON 사전을 역 직렬화 <string, Dictionary <string, string >> optional?

public class TriggerRequest 
{ 
    public string reference { get; set; } 
    public Dictionary<string, string> fields { get; set; } 

} 

물론,이 처리하지 않는 선은 객체 :

{ 
    "REFERENCE": "1", 
    "FIELDS" : { 
     "CUST" : "1234", 
     "PROD" : "PR2134", 
     "LIMIT" : "12345", 
     "LINES" : { 
       "LINE" : "01", 
       "DATA" : "12" 
     } 
    } 
} 

내 목적은 단순히 다음있다. LINES 같은 것이 동적 인 인바운드 페이로드를 역 직렬화하는 클래스를 만들려면 어떻게해야합니까 (예 : 페이로드의 임의의 지점에서 임의의 사전을 보낼 수 있습니다. 올바르게 역 직렬화 할 수 있습니다.) 사용자 정의 JsonConverter를 만들어야 할 때 무언가입니까? ?

+0

.. – Steve

+1

으로

public Dictionary<string, dynamic> fields { get; set; } 

변경 JSON.net 및 Silverlight의'System.Json' 대부분은 역동적으로 또는'Dictionary ' –

+0

'에 비 직렬화 할 수 있습니다. JObject obj = JsonConv 'Newtonsoft.Json' 라이브러리 (AKA Json.net)의 ert.DeserializeJson (string json)'이 아마도 당신이 성취하려는 것을 위해 잘 작동 할 것입니다. –

답변

2

대신 dynamic을 사용할 수 있습니다. 이것은 당신이 예를 들어, 코드에서 직접 (string)request.fields.lines.data에 액세스 할 수 있도록해야한다

public class TriggerRequest 
{ 
    public string reference { get; set; } 
    public dynamic fields { get; set; } 
} 

.

을하지만, 당신이 어떤 값을 컴파일 타임에 알 수없는 경우 거기에있을거야, 당신은 필드를 만들 선호 할 수 있습니다 JObject .

public class TriggerRequest 
{ 
    public string reference { get; set; } 
    public JObject fields { get; set; } 
} 

이렇게하면 각 속성에 어떤 데이터가 있는지 검사하고 그에 따라 응답하는 코드를 작성할 수 있습니다.

마지막으로 일 경우에 어떤 속성이 있는지 알고 싶으면 fields에 대해 별도의 클래스를 만듭니다.

public class TriggerRequest 
{ 
    public string reference { get; set; } 
    public TriggerRequestFields fields { get; set; } 
} 

public class TriggerRequestFields 
{ 
    public string cust {get;set;} 
    ... 
    public TriggerRequestLines lines {get;set;} 
} 

public class TriggerRequestLines 
{ 
    public string line {get;set;} 
    public string data {get;set;} 
} 
0

에 한번 자신의 JSON 변환이 포함 이미 일부 패키지로 보일 것입니다 롤 시작하기 전에이 경우 민감한 때문입니다

public Dictionary<string, object> fields { get; set; }