Проблема с возвратом ассоциативного массива JSON из ASP.NET Основной веб-API

#json.net #asp.net-core-webapi #system.text.json

#json.net #asp.net-core-webapi #system.text.json

Вопрос:

У меня есть метод веб-API в ASP.NET Ядро 3.1, которое возвращает перечислимый список объектов:

public async Task<IEnumerable<MyObject>> Get()

Веб-API возвращает JSON по умолчанию. Это работало нормально, пока я не добавил свойство типа Dictionary<int, object> в MyObject, не понимая, что любой сериализатор ASP.NET Ядро 3.1, используемое для построения ответа, не может сериализовать словарь (ошибка «тип Dictionary<int, object> не поддерживается»). Я могу воспроизвести ту же ошибку, попытавшись сериализовать словарь, используя новый System.Text.Библиотека Json, которая, как я предполагаю, используется веб-API для построения ответа JSON.

Поскольку JsonConvert по-прежнему отлично сериализует Dictionary, было бы нетрудно выполнить сериализацию вручную в методе. Но это означает создание моего собственного ответа JSON и возврат его в виде строки содержимого, которая только кажется… не очень.

Существует ли другой тип ассоциативного массива, который я мог бы использовать, чтобы веб-API мог правильно сериализовать в JSON? Или есть способ настроить веб-API для использования библиотеки сериализации JSON, которая может обрабатывать Dictionary? Или я просто застрял в создании собственного ответа JSON для этого метода?

Редактировать: чтобы было ясно, мне любопытно, какие из них возможны, каковы преимущества или недостатки каждого, чтобы я мог выбрать хорошее решение для своих обстоятельств.

Комментарии:

1. Если бы только Google мог ответить на этот вопрос.

2. В документации Microsoft есть пример того, как написать пользовательский JsonConverter Dictionary<Enum,TValue> словарь for : Support с помощью нестрокового ключа . Вы могли бы следовать этому шаблону. Или просто преобразуйте свою модель данных из Dictionary<int, T> в Dictionary<string, T> которую будет работать.

3. @IanKemp Извините, но я был здесь, чтобы спросить не только о том, возможен ли каждый подход, но и о том, был ли он лучше или хуже других. По крайней мере, по моему опыту, StackOverflow лучше справляется с этим, чем Google.

4. @dbc Спасибо, я даже не думал о преобразовании базового типа словаря, потому что я не понял, что речь идет именно о нестроковом ключе. Это должно сработать для нас без необходимости изменения сериализации Json, используемой API.

5. @Jason Извините, если я натолкнулся на curt — в Stack Overflow задано много вопросов, большинство из которых не стоят ничьего времени, и с ними становится неприятно иметь дело. Похоже, что вы на самом деле здесь, чтобы учиться, и это именно то, о чем этот сайт, и я не хочу препятствовать этому. Просто убедитесь, что ваши вопросы будут максимально конкретными — это поможет нам помочь вам.

Ответ №1:

Этот ответ получен от @dbc в комментариях. Я не понял, что System.Text.Проблема с сериализацией словаря в Json была связана не со словарем в целом, а конкретно с Dicitonary с использованием нестрокового ключа. Для нас было тривиально написать конвертер для перевода необходимого словаря в строковый тип, а затем встроенная сериализация JSON отлично справилась с этим.

Спасибо, @dbc!