2012-10-01 75 views
-1

我知道這個問題已經被問生厭,但現有的答案都沒有特別有幫助我。最好的是Deserialize JSON into C# dynamic object?,但我不想創建一個對象,我想創建一個Dictionary。反序列化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

順便說一下,你的序列化代碼是不正確的。 JSON不允許未加引號的字符串作爲鍵。 – millimoose

+0

'我想知道是否有更優雅的方式。使用linq並不會讓你的方式更加優雅。 –

回答

3

我推薦使用NuGet包'Newtonsoft.Json'。

該包所使用的WebAPI用於序列化/反序列化和也相當快。更多信息可以在這裏找到: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, 
      } 
} 

對象,將持有的數據:

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()); 

希望它能幫助!