2012-07-11 44 views
0

我怎么能反序列化JSON这个成如何反序列化此JSON。我应该选择什么基础课程?

Dictionary<string, List<typeof(new {name=""; call=""})>>

类型是在列表中的实例并不一定是匿名的。

{ "item a": [ { "name": "alpha", "call": "a" } ], 
    "item b": [], 
    "item c": [ 
        { "name" : "beta" , "call" : "b" }, 
        { "name" : "gamma", "call" : "g" }, 
        { "name" : "alpha", "call" : "a" } 
       ] 
    } 

回答

2

不要使用匿名类型,使用一个“真实”的一个。而JSON.NET可以反序列化它:

public class StackOverflow_11439028 
{ 
    public class MyType 
    { 
     public string name { get; set; } 
     public string call { get; set; } 
    } 

    const string Json = @"{ ""item a"": [ { ""name"": ""alpha"", ""call"": ""a"" } ], 
          ""item b"": [], 
          ""item c"": [ 
           { ""name"" : ""beta"" , ""call"" : ""b"" }, 
           { ""name"" : ""gamma"", ""call"" : ""g"" }, 
           { ""name"" : ""alpha"", ""call"" : ""a"" } 
          ] 
         }"; 

    public static void Test() 
    { 
     JsonSerializer js = new JsonSerializer(); 
     Func<List<MyType>, string> listToString = l => 
      "[" + string.Join(", ", l.Select(t => string.Format("{0}-{1}", t.call, t.name))) + "]"; 

     using (JsonTextReader jtr = new JsonTextReader(new StringReader(Json))) 
     { 
      var obj = js.Deserialize<Dictionary<string, List<MyType>>>(jtr); 
      Console.WriteLine(string.Join(", ", obj.Select(kvp => string.Format("{{{0}, {1}}}", kvp.Key, listToString(kvp.Value))))); 
     } 

     JavaScriptSerializer jss = new JavaScriptSerializer(); 
     var dict = jss.Deserialize<Dictionary<string, List<MyType>>>(Json); 
     Console.WriteLine(string.Join(", ", dict.Select(kvp => string.Format("{{{0}, {1}}}", kvp.Key, listToString(kvp.Value))))); 
    } 
} 
+0

是否可以使用'System.Runtime.Serialization.Json.DataContractJsonSerialize'insted? – AstroSharp 2012-07-11 19:48:42

+0

只有在.NET Framework 4.5中。直到4.0,'DataContractJsonSerializer'不能将任意的JSON对象反序列化为'Dictionary '。如果你不想要第三方库(如JSON.NET),另一个选择是使用'JavaScriptSerializer'类(更新代码以显示它)。 – carlosfigueira 2012-07-11 20:23:01