C#: десериализовать строку JSON до определенного типаC#

Место общения программистов C#
Ответить
Anonymous
 C#: десериализовать строку JSON до определенного типа

Сообщение Anonymous »

Мой REST API возвращает строку JSON клиенту (приложение dotnet), и моему клиенту необходимо проанализировать и десериализовать строку JSON до определенного типа, который расширяет общий тип.
Скажем, общее имя модели — DataModel, определенное с помощью одного свойства UpdateTime следующим образом:

Код: Выделить всё

using Newtonsoft.Json;

public class DataModel
{
public DateTime UpdateTime { get; set; }
}

Чтобы назвать несколько классов/типов, расширяющих общую модель:

Код: Выделить всё

public ArticleContent : DataModel
{
public string Title { get; set; }
public string Content { get; set; }
}

public CommentContent : DataModel
{
public string Comment { get; set; }
public int ArticleId { get; set; }
}

Когда клиент получает ответ JSON, он не знает, в какой тип ему следует десериализовать строку JSON. Поэтому я придумал следующее двухэтапное решение:
  • Создайте перечисление, которое связано с каждым типом (например, ArtileContent, CommentContent):

Код: Выделить всё

public enum ContentType
{
Article = 0,
Comment,
Opinion,
}
  • Затем создайте класс-оболочку ApiResponse, который имеет следующие два свойства:
    • TypeOfContent (для указания DataModel)
    • общее свойство ContentModel
    Поместите класс-оболочку в код:

    Код: Выделить всё

    public class ApiResponse where T : DataModel
    {
    public ContentType TypeOfContent { get; set; }
    
    public T ContentModel { get; set; }
    
    }
    
    
    Чтобы реализовать это решение, мне пришлось реорганизовать ответ JSON, включив в него два поля:

    Код: Выделить всё

    {
    "TypeOfContent": 0,
    "ContentModel": {
    "Title": "Article 1 Title",
    "Content": "ABC content"
    }
    }
    
    
    При анализе строки JSON мне пришлось сначала десериализовать ее в общую модель данных:
  • Код: Выделить всё

    ApiResponse apiResponse = JsonConvert.DeserializeObject(apiJsonResponse);
  • Проверьте TypeOfContent в apiResponse с помощью блока if-else if, а затем выполните синтаксический анализ для конкретного тип:

Код: Выделить всё

if (apiResponse.TypeOfContent == ContentType.Article) {
ApiResponse articleResponse = JsonConvert.DeserializeObject(apiJsonResponse);
} else if (apiResponse.TypeOfContent == ContentType.Comment) {
///
}

Мой вопрос: есть ли лучшее решение для анализа строки json до определенного типа, чем двухэтапное решение в C#? Я не эксперт в C#. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/793 ... cific-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»