#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!