2012-10-01 246 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()); 

希望它能帮助!