Как разобрать полиморфные объекты Json.NET? - PullRequest
3 голосов
/ 10 мая 2011

Я написал веб-сервис, который отправляет и возвращает json, созданный с помощью Json.NET. Я включил typenames, что позволяет полиморфизм. С битом взлома , я получил эту работу с клиентом 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");
        }

    }
}

Ответы [ 2 ]

3 голосов
/ 10 мая 2011

Чтобы выполнить настоящий анализ, вы можете использовать метод json2.js или JQuery $ .parseJSON (). Они создадут объект javascript, который напрямую напоминает JSON, который вы отправили.

Поскольку Javascript - это язык сценариев, вы больше не будете думать о «полиморфизме», но вы должны быть в состоянии оценить свойства объектов (не обращая внимания на то, какой «тип» объекта они представляют) следующим образом:

var obj = $.parseJSON(json);
var firstAnimalName = obj.Animals[0].Name;
0 голосов
/ 10 мая 2011

Попробуйте https://github.com/douglascrockford/JSON-js/blob/master/json2.js. Существует функция синтаксического анализа, которая безопасно проанализирует вашу строку в объект JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...