2013-09-03 2 views
0

개체를 내 디자인 클래스로 역 직렬화하는 작업을 처리하려고합니다. 내가받을 문자열은 다음과 같습니다 json 문자열에 대한 C# 클래스 설계시 어려움

{nodename:"node1", version:"v1", PARM1:"p1", PARM2:"p2" ,…, PARAMN:"pn"}. 

는 지금까지 내가 이해, 나는이 JSON 문자열을위한 클래스가 필요합니다, 노드 내 클래스 이름을 말한다. 내 클래스 노드에 두 개의 필드를 추가하여 노드 이름과 버전을 쉽게 처리 할 수 ​​있다는 것을 알고 있습니다. 그러나 Params 세트는 어떨까요? 이 문자열에있는 매개 변수의 수가 동적이기 때문에 제 수업을 어떻게 디자인해야할지 모르겠습니다. 이 점을 밝혀주세요. 아니면 그것이 불가능하다고 생각합니까? 미리 감사드립니다

+0

예제에 속성 값이 없으면 JSON처럼 보이지 않습니다. – Matthew

+0

예, 각 속성의 값을 생략했습니다. 혼란을 드려 죄송합니다. @ 매튜 – liudaisuda

답변

1

당신은에 Params 이름과 형식이 중요하지 않은 경우

 

    public class ResultObject 
    { 
     public string NodeName { get; set; } 
     public string Version { get; set; } 
     public List&ltstring> Params { get; set; } 
    } 

위의 코드를 사용하여 목록과 같은 일반적인 컬렉션을 사용할 수 있습니다. 당신은 다음 매개 변수로 Param1을,과 Param2, ...를 Paramn을 원하는 경우 :

 

    public class ResultObject 
    { 
     public string NodeName { get; set; } 
     public string Version { get; set; } 
     public Dictionary&ltstring, string> Params { get; set; } 
    } 

그런 다음 등등 VAR X =에 Params [ "Param1을"]와 같은 키에 Params에 액세스 할 수 있습니다.

+0

저는 질문이 당신이 제안한 것과 같은 객체에 json을 비 직렬화하는 방향으로 조정했다고 생각합니다. 클래스 자체의 정의는 아닙니다. – Matthew

+0

Matthew, 당신은 이것에 절대적으로 맞습니다. 질문은 확실히 내가 성취하고자하는 것을 생각하면 단계적으로 잘되어 있지 않습니다. 귀하의 답변에 많은 감사드립니다. .NET 표준 라이브러리를 고수한다면 지금까지 내가 가장 많이 얻을 수있는 것입니다. -) @Matthew – liudaisuda

+0

멋진 코드 조각을 보내 주셔서 감사합니다, 사이. 그것은 nodename과 버전에 대한 나의 관심을 없앤다. Mattew의 대답으로, 노드 이름과 버전을 사전에 추가해야한다고 생각했습니다. @ 사이 – liudaisuda

0

코드에서 json을 가장 쉽게 나타내는 것은 모든 속성 값이 문자열임을 알고있는 경우 Dictionary<string, object> 또는 Dictionary<string, string>으로 역 직렬화하는 것입니다.

json serializer에 따라 구문이 다를 수 있습니다. 이것은 Microsoft JavaScriptSerializer을 사용하고 있습니다.

var serializer = new JavaScriptSerializer(); 

var dict = serializer.Deserialize<Dictionary<string, string>>(jsonString); 

Console.WriteLine(dict["nodename"]); // "node1" 
Console.WriteLIne(dict["PARM1"]); // "p1" 

Dictionary.Keys 속성을 사용하여 json 문자열의 모든 속성에 대한 추가 정보를 얻을 수도 있습니다.

+0

귀하의 제안은 매개 변수의 수를 알 수없는 문제를 푸는 데 확실히 도움이됩니다. 그러나 Dictionary를 직접 사용하면 매개 변수를 제어 할 수 없습니다. 이것에 의해, 나는 몇몇 매개 변수들의 값을 검증 할 필요가 있음을 의미한다. 필자의 경우에는 문자열 또는 정수 유형의 매개 변수 만 받아 들일 것입니다. 이 경우 사용자 지정 serializer를 구현해야 할 것이라고 생각합니까? – liudaisuda

+0

json.net은 더 많은 유연성을 발휘할 수 있지만, 원하는 것을 달성하기 위해 랩퍼 (또는 사용자 정의 직렬 변환기)가 필요할 수도 있습니다. – Matthew

+0

문자열 또는 숫자를 처리 할 가능성을 고려하여 먼저 사용자 지정 serializer를 구현할 생각입니다. DataContractJsonSerializer 또는 다른 표준 NET 라이브러리 클래스를 사용하여 수행 할 수 있다고 생각합니까? 최선의 선택은 서드 파티 라이브러리없이 수행하는 것입니다. @ Matthew – liudaisuda