我在使用JavaScriptSerializer库在我的c#代码中反序列化JSON时遇到了问题。
以下是我的示例JSON:
{" A":[""" B"" C"" d"] " B":["&#34]," C":[]}
我使用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字符串。
答案 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; }
}