如何解析Json.NET多态对象?

我编写了一个Web服务,它发送并返回用Json.NET创建的json。 我已经包含了类型名称,它允许多态性。 有点黑客攻击 ,我已经使用了Silverlight客户端,但我不知道如何让它适用于javascript客户端。

如何使用javascript解析这个?

{ "$type": "MyAssembly.Zoo, MyAssembly", "ID": 1, "Animals": [ { "$type": "MyAssembly.Dog, MyAssembly", "LikesBones": true, "Name": "Fido" }, { "$type": "MyAssembly.Cat, MyAssembly", "LikesMice": false, "Name": "Felix" } ] } 

这是c#类:

 public class Animal { public string Name { get; set; } } public class Dog : Animal { public bool LikesBones { get; set; } } public class Cat : Animal { public bool LikesMice { get; set; } } public class Zoo { public int ID { get; set; } private List m_Animals = new List(); public List Animals { get { return m_Animals; } set { m_Animals = value; } } public static void Test1() { Zoo z1 = new Zoo() { ID = 1 }; z1.Animals.Add(new Dog() { Name = "Fido", LikesBones = true }); z1.Animals.Add(new Cat() { Name = "Felix", LikesMice = false }); var settings = new JsonSerializerSettings(); settings.TypeNameHandling = TypeNameHandling.Objects; string s1 = JsonConvert.SerializeObject(z1, Formatting.Indented, settings); Debug.WriteLine(s1); var z2 = JsonConvert.DeserializeObject(s1, settings); foreach (Animal a in z2.Animals) { if (a is Dog) Debug.WriteLine(((Dog)a).LikesBones); else if (a is Cat) Debug.WriteLine (((Cat)a).LikesMice); else Debug.WriteLine("error"); } } } 

要进行实际的解析,可以使用json2.js或JQuery的$ .parseJSON()方法。 这些将创建一个直接类似于您发送的JSON的javascript对象。

由于Javascript是一种脚本语言,你不再考虑“多态”了,但你应该能够评估对象的属性(不关心它们的“类型”),如下所示:

 var obj = $.parseJSON(json); var firstAnimalName = obj.Animals[0].Name; 

试试https://github.com/douglascrockford/JSON-js/blob/master/json2.js 。 有一个解析函数可以安全地将你的字符串解析为一个javascript对象。