我编写了一个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<Animal> m_Animals = new List<Animal>();
public List<Animal> 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<Zoo>(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() 方法。这些将创建一个JavaScript对象,该对象直接类似于您发送的JSON。
由于Javascript是一种脚本语言,你不会再考虑"多态性",但你应该能够评估对象的属性(而不关心它们是什么"类型"的对象),如下所示:
var obj = $.parseJSON(json);
var firstAnimalName = obj.Animals[0].Name;
尝试 https://github.com/douglascrockford/JSON-js/blob/master/json2.js。有一个解析函数可以将您的字符串安全地解析为 javascript 对象。