无法将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字符串。
不要使用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; }
}