2012-10-25 3 views
1

고정 필드 이름을 가진 작은 고정 크기, 고정 된 구조를 직렬화 복원, JSON 문자열은 쉽게 변수 이름과 변수 크기 JSON 문자열을 역 직렬화하기 컴파일 타임에 알려짐).어떻게

반복되는 반복되는 중첩 된 쌍의 비 직렬화는 다소 어렵지만 클래스 내부의 List<>을 사용하여 수행 할 수 있습니다.

그러나 필드의이 컴파일 타임에 알려지지 않은 경우 어떻게해야합니까? 예 :

{ 
    "container":{ 
     "GD01AB491103":{ 
     "field_id1":11, 
     "field_id2":12, 
     "field_id3":13, 
     "field_id4":"fourteen" 
     }, 
     "DC01AB491103":{ 
     "field_id1":21, 
     "field_id2":22, 
     "field_id3":23, 
     "field_id4":"twenty four" 
     }, 
     "GH01AB451101":{ 
     "field_id1":31, 
     "field_id2":32, 
     "field_id3":33, 
     "field_id4":"thirty four" 
     } 
     . 
     . 
     . 
    }, 
    "terminator" 
} 

문자열을 역 직렬화하는 방법은 무엇입니까?

(바람직하게는 .NET의 JavaScriptSerializer하지만 그것은 불가능/너무 약한 경우, 내가 뭔가에 의지해야 할 수도 있음)

편집 : 위해, 위의 예에서 : 도전의 성격을 명확히하기 위해

public class ?????? 
{ 
    public int field_id1 {get;set;} 
    public int field_id2 {get;set;} 
    public int field_id3 {get;set;} 
    public string field_id4 {get;set;} 
} 

내가 이러한 변수 이름의 클래스 객체와 런타임 빌드 클래스 (반사?)에서 다음 먼저 JSON 문자열을 조회해야하는 클래스를 정의? 너무 복잡 ... 아마도 더 온건 한 방법이 같은데?

아니면 클래스/필드 이름은 .NET의 JavaScriptSerializer 모든 문제와 관련이없는

는 유형입니까? 당신은 아마 더 간단하게 .. 당신의 ?????? 클래스는 아무것도 할 수 있습니다 당신이 생각하는 것보다이 작업을 수행 할 수 있습니다

답변

3

(물론하고 정확한 구조) ..

public class GenericObject 
{ 
    public int field_id1 {get;set;} 
    public int field_id2 {get;set;} 
    public int field_id3 {get;set;} 
    public string field_id4 {get;set;} 
} 

다음 객체로 객체 그래프의 루트를 역 직렬화 그것은 포함하는 Dictionary<string,GenericObject> ...

public class SomeContainer 
{ 
    public Dictionary<string,GenericObject> container {get;set;} 
} 

그런 다음 사전의 값을 통해 루프를 사용하면 키 이름에 대한 상관 없어 할 수 있습니다.

+0

감사합니다. 이 과정을 간단하게 할 수있는 방법에 대한 나의 탐구에서 나는 주어진 JSON 문자열에서 C# 클래스 건물 자동화 된이 위대한 사이트 발견 :/: http://json2csharp.com/ –

+0

사실을, 그것은 모두 [JSON.net] (http로 작동 /stackoverflow.com/a/1212115/562776) 및 .NET의 [JavaScriptSerializer (http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer%28v=vs.100% 29.aspx). –

+0

그래, 유효한 시리얼 라이저와 독립적이어야한다. 내가 말한''터미네이터 ''엔트리는 유효한 JSON이 아니기 때문에 하나의 관심사였다.하지만 힌트 일 뿐이라면 괜찮을 것이다. FWIW 옵션이 있다면 (너무 미묘한 .net 제네릭) 성능상의 이유로 JavaScriptSerializer보다 JSON.net을 권하고 싶습니다. –