无法将JSON反序列化为Dictionary <string,list <string =“”>&gt;使用JavaScriptSerializer

时间:2015-11-12 18:06:48

标签: c# .net json casting javascriptserializer

我在使用JavaScriptSerializer库在我的c#代码中反序列化JSON时遇到了问题。

以下是我的示例JSON:

  

{&#34; A&#34;:[&#34;&#34;&#34; B&#34;&#34; C&#34;&#34; d&#34;] &#34; B&#34;:[&#34;&#34],&#34; C&#34;:[]}

我使用Dictionary来保存JSON,如下所示:

Dictionary<string, List<string>> myObject;

这是我解析JSON并将其强制转换为我的对象的方法:

myObject= (Dictionary<string, List<string>>)jsc.DeserializeObject(json);

但是,在运行时,前一行会抛出Casting异常,如下所示

  

无法投射类型的对象   System.Collections.Generic.Dictionary2 [System.String,System.Object的]   输入   System.Collections.Generic.Dictionary2 [System.String,System.Collections.Generic.List1 [System.String]]

由于某种原因,JavaScriptSerializer无法识别具有List<string>的字符串的JSON数组

更新

我使用一些硬编码字符串填充了我的Dictionary数据结构,以查看序列化版本是什么。事实证明,这正是我输入的JSON字符串。

3 个答案:

答案 0 :(得分:2)

不使用DeserializeObject方法,而是使用通用Deserialize<T>方法并指定Dictionary<string, List<string>>作为类型参数。然后它将正常工作:

string json = @"{""A"":[""a"",""b"",""c"",""d""],""B"":[""a""],""C"":[]}";

JavaScriptSerializer serializer = new JavaScriptSerializer();

Dictionary<string, List<string>> myObject = 
    serializer.Deserialize<Dictionary<string, List<string>>>(json);

foreach (KeyValuePair<string, List<string>> kvp in myObject)
{
    Console.WriteLine(kvp.Key + ": " + string.Join(",", kvp.Value));
}

输出:

A: a,b,c,d
B: a
C:

答案 1 :(得分:1)

问题是转为List<string> 如果可以接受对象的投射,可以这样做:

string json = "{\"A\":[\"a\",\"b\",\"c\",\"d\"],\"B\":[\"a\"],\"C\":[]}";
var serializer = new JavaScriptSerializer();
var deserializedValues = (Dictionary<string, object>)serializer.Deserialize(json, typeof(object));

我还建议调查Json.NET,它在序列化/反序列化方面做得更好

答案 2 :(得分:0)

基于JSON结构创建一个Type,然后像这样使用Serialization或DeSerialization中的Type。

我使用Web Essentials Visual Studio扩展中的功能从JSON创建RootObject。

public class JSONSerializer
{
    public void RunIt()
    {
        string json = "{\"A\":[\"a\",\"b\",\"c\",\"d\"],\"B\":[\"a\"],\"C\":[]}";

        JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();

        Rootobject jsonObject = serializer.Deserialize<Rootobject>(json);

        Console.Write(serializer.Serialize(jsonObject));
    }
}

public class Rootobject
{
    public string[] A { get; set; }
    public string[] B { get; set; }
    public object[] C { get; set; }
}