2012-10-01 3 views
-1

이 질문에 광고 메스꺼움이 있었지만 기존 대답은 특히 도움이되지 않았다는 것을 알고 있습니다. 최고는 Deserialize JSON into C# dynamic object?이지만 개체를 ​​만들고 싶지는 않습니다. 사전을 만들고 싶습니다.JSON을 C#에서 역 직렬화

나는 그렇게처럼 내 데이터를 직렬화, 나는 정확히 같은 데이터 구조에 직렬화하는 :

public static string AugDictToJSON(Dictionary<string, List<Dictionary<string, object>>> dict) 
    { 
     return string.Join(",", dict.Select(
      d => string.Format("{{ \"{0}\" : [ {1} ] }}", d.Key, 
       string.Join(",", d.Value.Select(i => SubAugDictToJSON(i)).ToArray()) 
      )).ToArray()); 
    } 

    public static string SubAugDictToJSON(Dictionary<string, object> dict) 
    { 
     return string.Join(",", dict.Select(
       d => string.Format("{{ \"{0}\" : \"{1}\" }}", d.Key, d.Value.ToString()) 
      ).ToArray()); 
    } 

편집 : 솔루션 인 (허용 대답에서) 다음

public static Dictionary<string, List<Dictionary<string, object>>> JSONToAugDict(string json) 
{ 
    return JsonConvert.DeserializeObject<Dictionary<string, List<Dictionary<string, object>>>>(json); 
} 
+0

v4.5를 사용하는 경우 ['JsonValue.Parse()'] (http://msdn.microsoft.com/en-us/library/system.json.jsonvalue.parse.aspx) 또는 형제 자매가 충분히 가까울 수도 있습니다. (여기 4.5가 아니기 때문에 코드를 테스트 할 수는 없습니다.) – millimoose

+1

한편, serialization 코드가 올바르지 않습니다. JSON은 인용되지 않은 문자열을 키로 허용하지 않습니다. – millimoose

+0

'더 우아한 방법이 있을지 궁금하다. ' linq을 사용하는 것은 당신의 방법을 우아하게하지 않습니다. –

답변

3

NuGet 패키지 'Newtonsoft.Json'을 사용하는 것이 좋습니다.

이 패키지는 WebAPI에서 serialization/deserialization을 위해 사용하며 매우 빠릅니다. 더 많은 정보는 여기에서 찾을 수 있습니다 : http://james.newtonking.com/pages/json-net.aspx

var results = JsonConvert.DeserializeObject<dynamic>(json); 

또는, IDictionary 같이

var result = JsonConvert.DeserializeObject<IDictionary<string, object>>(json); 
+0

nope. 객체를 만들고 싶지 않다. –

+1

좋아, 사전에 역 직렬화하기위한 수정 된 답변을 참조하십시오. – Joshua

+0

감사합니다 (그리고 몇 자루 더) –

1

가 내가 작업 한 응용 프로그램에 대한 Json.NET을 사용하여 비슷한 시도 (내 자신의 질문에서 발췌 : Deserializing json string into an object - Silverlight)

JSON :

{ 
    "disclaimer": "This data is collected from various providers and provided free of charge for informational purposes only, with no guarantee whatsoever of accuracy, validity, availability or fitness for any purpose; use at your own risk. Other than that - have fun, and please share/watch/fork if you think data like this should be free!", 
    "license": "Data collected from various providers with public-facing APIs; copyright may apply; not for resale; no warranties given.", 
    "timestamp": 1334183999, 
    "base": "USD", 
    "rates": { 
       "AED": 3.6732, 
       "AFN": 48.400002, 
       "ALL": 106.669998, 
      } 
} 
데이터를 보유합니다 0

대상 :

public class ExchangeData 
{ 
    public string disclaimer { get; set; } 
    public string license { get; set; } 
    public string timestamp { get; set; } 
    public string @base { get; set; } 
    public Dictionary<string, double> rates { get; set; } 
} 

는 데이터 구조를 만들려면 :

StreamReader reader = new StreamReader(args.Result); 
ExchangeData data = JsonConvert.DeserializeObject<ExchangeData>(reader.ReadToEnd()); 

는 희망이 도움이!