无法使用 JavaScriptSerializer 将 JSON 反序列化为 Dictionary<string, List<string>>
Unable to deserialize JSON to a Dictionary<string, List<string>> using JavaScriptSerializer
我在使用 JavaScriptSerializer 库的 C# 代码中反序列化 JSON 时遇到问题。
这是我的示例 JSON:
{"A":["a","b","c","d"],"B":["a"],"C":[]}
我正在使用字典来保存 JSON 如下:
Dictionary<string, List<string>> myObject;
这就是我解析 JSON 并将其转换为我的对象的方式:
myObject= (Dictionary<string, List<string>>)jsc.DeserializeObject(json);
但是在运行时,上一行抛出如下Casting异常
Unable to cast object of type
System.Collections.Generic.Dictionary2[System.String,System.Object]
to type
System.Collections.Generic.Dictionary2[System.String,System.Collections.Generic.List1[System.String]]
出于某种原因,JavaScriptSerializer
无法识别 JSON 具有字符串的数组 List<string>
更新
我用一些硬编码字符串填充了我的 Dictionary
数据结构,以查看什么是序列化版本。结果正是我输入的 JSON 字符串。
基于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; }
}
问题是投射到 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,它在 serializing/deserializing
方面做得更好
不使用 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:
我在使用 JavaScriptSerializer 库的 C# 代码中反序列化 JSON 时遇到问题。
这是我的示例 JSON:
{"A":["a","b","c","d"],"B":["a"],"C":[]}
我正在使用字典来保存 JSON 如下:
Dictionary<string, List<string>> myObject;
这就是我解析 JSON 并将其转换为我的对象的方式:
myObject= (Dictionary<string, List<string>>)jsc.DeserializeObject(json);
但是在运行时,上一行抛出如下Casting异常
Unable to cast object of type System.Collections.Generic.Dictionary2[System.String,System.Object] to type System.Collections.Generic.Dictionary2[System.String,System.Collections.Generic.List1[System.String]]
出于某种原因,JavaScriptSerializer
无法识别 JSON 具有字符串的数组 List<string>
更新
我用一些硬编码字符串填充了我的 Dictionary
数据结构,以查看什么是序列化版本。结果正是我输入的 JSON 字符串。
基于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; }
}
问题是投射到 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,它在 serializing/deserializing
方面做得更好不使用 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: