【问题标题】:How to parse Json.NET polymorphic objects?如何解析 Json.NET 多态对象?
【发布时间】:2011-08-22 15:30:03
【问题描述】:

我编写了一个 Web 服务,它发送和返回使用 Json.NET 创建的 json。我已经包含了允许多态性的类型名。使用bit of hacking,我可以使用 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");
        }

    }
}

【问题讨论】:

  • 你能在 Silverlight 中显示你的反序列化代码吗?我很好奇你是怎么让它工作的。到目前为止,我的尝试没有奏效。 stackoverflow.com/questions/5943764/…
  • @rboarman 我添加了反序列化代码。
  • 我也是这样做的。谢谢

标签: c# javascript json json.net


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      相关资源
      最近更新 更多