无法将JSON反序列化为Dictionary<;字符串,列表<;字符串>>;使用JavaScriptSe

本文关键字:字符串 gt lt 列表 使用 JavaScriptSe JSON Dictionary 反序列化 | 更新日期: 2023-09-27 18:21:38

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

这是我的示例JSON:

{"A":["A","b","c","d"],"b":["A"],"c":[]}

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

Dictionary<string, List<string>> myObject;

这就是我解析JSON并将其转换为我的对象的方式:

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

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

无法强制转换类型为的对象System.Collections.Generic.DDictionary2[System.String,System.Object]到类型System.Collections.Generic.DDictionary2[System.String,System.Collections.Generic.List1[System.SString]]

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

更新

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

无法将JSON反序列化为Dictionary<;字符串,列表<;字符串>>;使用JavaScriptSe

不要使用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:

问题是转换为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,它在序列化/反序列化方面做得更好

基于JSON结构创建一个类型,然后像这样在序列化或反序列化中使用该类型。

我使用Web Essentials Visual Studio Extension中的功能从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; }
}