Использование преобразователей Json.NET для десериализации свойств

У вас есть решение. Существует событие, называемое routeMatched, когда навигацию запускается каждый раз. Вы можете прикрепить событие на странице подробностей.

 onInit : function () {
    this._oRouter = sap.ui.core.UIComponent.getRouterFor(this);
    this._oRouter.attachRouteMatched(this.handleRouteMatched, this);
},

handleRouteMatched : function (evt) {
    //Check whether is the detail page is matched.
    if (evt.getParameter("name") !== "detail") {
        return;
    //You code here to run every time when your detail page is called.
}

С уважением, Allen

84
задан David 24 March 2014 в 04:21
поделиться

3 ответа

Вот ссылка на статью, написанную ScottGu

Основываясь на ней, я написал некоторый код, который, как мне кажется, может быть полезен

public interface IEducationalInstitute
{
    string Name
    {
        get; set;
    }

}

public class School : IEducationalInstitute
{
    private string name;
    #region IEducationalInstitute Members

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    #endregion
}

public class Student 
{
    public IEducationalInstitute LocalSchool { get; set; }

    public int ID { get; set; }
}

public static class JSONHelper
{
    public static string ToJSON(this object obj)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        return serializer.Serialize(obj);
    }
    public  static string ToJSON(this object obj, int depth)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        serializer.RecursionLimit = depth;
        return serializer.Serialize(obj);
    }
}

И вот как это можно назвать

School myFavSchool = new School() { Name = "JFK High School" };
Student sam = new Student()
{
    ID = 1,
    LocalSchool = myFavSchool
};
string jSONstring = sam.ToJSON();

Console.WriteLine(jSONstring);
//Result {"LocalSchool":{"Name":"JFK High School"},"ID":1}

Если я правильно понимаю, я не думаю, что вам нужно указывать конкретный класс, реализующий интерфейс для сериализации JSON.

-9
ответ дан 24 November 2019 в 08:29
поделиться

Я тоже задавался этим вопросом, но боюсь, что это невозможно сделать.

Давайте посмотрим на это с другой стороны. Вы передаете JSon.net строку данных и тип для десериализации. Что должен сделать JSON.net, когда он столкнется с ISomething? Он не может создать новый тип ISomething, потому что ISomething не является объектом. Он также не может создать объект, реализующий ISomething, поскольку не знает, какой из множества объектов, наследующих ISomething, ему следует использовать. Интерфейсы - это то, что можно автоматически сериализовать, но не автоматически десериализовать.

Что бы я сделал, так это рассмотрел возможность замены ISomething базовым классом. Используя это, вы сможете добиться нужного эффекта.

-5
ответ дан 24 November 2019 в 08:29
поделиться

Одна из вещей, которые вы можете сделать с Json.NET :

var settings = new JsonSerializerSettings();
settings.TypeNameHandling = TypeNameHandling.Objects;

JsonConvert.SerializeObject(entity, Formatting.Indented, settings);

Флаг TypeNameHandling будет добавьте свойство $ type в JSON, которое позволяет Json.NET знать, в какой конкретный тип нужно десериализовать объект. Это позволяет десериализовать объект, по-прежнему выполняя интерфейс или абстрактный базовый класс.

Обратной стороной является то, что это очень специфично для Json.NET. $ type будет полностью квалифицированным типом, поэтому, если вы сериализуете его с помощью информации о типе, десериализатор также должен понимать его.

Документация: Настройки сериализации с Json.NET

87
ответ дан 24 November 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: