2017-04-03 1 views
0

C#을 사용하여 동적 JSON 개체를 deserialize하는 올바른 방법은 무엇입니까 (즉, 단일 키 유형이 개체간에 변경 될 수있는 일부 JSON)? 나는이 (완벽 유효) JSON이있는 경우 예를 들어사용자 지정 동적 JSON 역 직렬화

: 나는 이러한 클래스가 정의한 경우

{ 
    "stuffs": [ 
    { "content": "abcd" }, 
    { "content": "efgh" }, 
    { "content": [ 
     "ijkl", 
     "mnop" 
    ]} 
    ] 
} 

어디 문자열 또는 문자열 배열 중 하나가 될 수있다, 어떻게 이것을 역 직렬화 할 thing?

Newtonsoft.Json.JsonSerializationException : '(예를 들어, { "이름"현재 JSON 객체를 직렬화 할 수 없습니다 : "값을"나는 (예상대로) 예외로 실행 직렬화하려고

class ThingContainer { 
    List<Thing> stuffs; 
} 

class Thing { 
    List<string> content; 
} 

}) 형식으로 'System.Collections.Generic.List`1 [DummyProject.Thing]'

+1

http://stackoverflow.com/questions/18994685/how-to-handle-both-a-single-item-and-an-array-for-the-same-property-using-json-n이 게시물 솔루션 설계에 도움이 될 것입니다. – Sameer

+0

@Sameer 감사합니다. 기존 질문을 검색 할 때 어떻게 찾지 못했는지 알 수 없습니다. 나는 복제물을 만들었다 고 생각한다. –

답변

0

귀하의 문제는 귀하의 C# 클래스가 JSON을 정확하게 나타내지 않는다는 것입니다.

JSON에는 "stuffs"개체가 포함 된 개체가 있습니다. "stuffs"개체 목록은 "content"문자열 목록입니다.

C# 클래스에있는 것은 문자열 목록 인 개체가 포함 된 개체입니다.

문자열 목록이 들어있는 개체 목록 인 개체가 포함 된 개체가 필요합니다.

이 시도 :

public class Content 
{ 
    public List<string> Content { get; set; } 
} 

public class Stuff 
{ 
    public List<Content> Contents { get; set; } 
} 

public class ThingContainer 
{ 
    public List<Stuff> Stuffs { get; set; } 
} 
+0

샘플 배열의 마지막 기준/항목에 대한 작업은 없습니다. 플랫 구조의 항목 하나인데도 목록에 deserialize하는 사용자 정의 포매터/디시리얼라이저일까요? –

+1

마지막 요구 사항이 목록이며 내 답변이 업데이트 된 것으로 나타났습니다. –

0

을 나는 C#에서 모든 솔루션은,하지만 난처럼 JSON 구조 adapte 할 수 있습니다 사용상 경우 잘 모릅니다 :

{ 
    arrayStuffs[ 
    { content: ['123', '456'] }, 
    // another arrays... 
    ], 
    stringStuffs{ 
    content: '', 
    // another strings.. 
    }, 
    // another stuffs, and so on 
} 

및 모든 거즈에 대한 모델을 정의 :

0

이 기능을 NewtonSoft와 함께 사용할 수 있는지는 잘 모르겠지만 Windows의 기본 제공 API로 돌아 가면 . Data.Json 당신은 당신이 원하는 모든 유연성을 얻을 수 있습니다.