Вернуть объект Json с помощью Duplicate Keys, используя C#
Я использую WEB API для получения запроса от клиентского приложения на сохранение контактной информации, и мне нужно отправлять сообщение об ошибке только в том случае, если в данных есть ошибка, в противном случае ничего TODO
Раньше я использовал словарь
Например:
Dictionary<string, string> error = new Dictionary<string, string>
{
{"SaveContactMethod_1", "FirstName Invalid"},
{"SaveContactMethod_2", "LastName Invalid"},
{"SaveContactMethod_3", "MiddleName Invalid"},
}
соответствующий объект JSON
{
"error" : {
"SaveContactMethod_1":"FirstName Invalid",
"SaveContactMethod_2":"LastName Invalid",
"SaveContactMethod_3":"MiddleName Invalid"
}
}
Но мне нужен УНИКАЛЬНЫЙ ключ (т.е. дубликат ключа), поэтому я изменил Dictionary<string, string>
в List<KeyValuePair<string, string>>
List<KeyValuePair<string, string>> error = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("SaveContactMethod", "FirstName Invalid"),
new KeyValuePair<string, string>("SaveContactMethod", "LastName Invalid"),
new KeyValuePair<string, string>("SaveContactMethod", "MiddleName Invalid"),
}
соответствующий объект JSON
{
"error" : [
{ "key":"SaveContactMethod", "value":"FirstName Invalid" },
{ "key":"SaveContactMethod", "value":"LastName Invalid" },
{ "key":"SaveContactMethod", "value":"MiddleName Invalid" }
]
}
Мое требование: мне нужно добавить дубликат ключа, и мне нужен вывод Json как словарь. Пожалуйста, помогите мне.
Ожидаемый результат: JSON
{
"error" : {
"SaveContactMethod":"FirstName Invalid",
"SaveContactMethod":"LastName Invalid",
"SaveContactMethod":"MiddleName Invalid"
}
}
Указанный JSON является допустимым форматом:
Онлайн инструмент № 1: https://jsonformatter.curiousconcept.com/
Онлайн инструмент № 2: http://jsonformatter.org/
Онлайн инструмент № 3: http://www.freeformatter.com/json-validator.html
Примечание: этот JSON предназначен только для чтения, мне нужно идентифицировать информацию, форму, откуда она поступает. Итак, я использовал имя метода как KEY. Парсер не собирается читать этот JSON. Так что нет проблем.
2 ответа
У вас классическая проблема "XY". Вы спросили "Как мне сделать X", но вам действительно нужно сделать Y, и вы думаете, что X - единственный способ добраться до Y - но X либо невозможно, либо очень сложно. Немного изменив свои требования, вы можете перейти к Y по-другому, но вы еще этого не видели, так как застряли на X.
Вот ваш X: формат JSON, который вы хотите получить:
{
"error" : {
"SaveContactMethod":"FirstName Invalid",
"SaveContactMethod":"LastName Invalid",
"SaveContactMethod":"MiddleName Invalid"
}
}
Это, как уже говорили другие, отбрасывает все сообщения об ошибках, кроме одного, когда вы загружаете его в свой код C#.
Тем не менее, есть очень простой способ получить все сообщения об ошибках. Вам просто нужно изменить JSON, который вы ожидаете, чтобы выглядеть примерно так:
{
"error" : {
"SaveContactMethod": [
"FirstName Invalid",
"LastName Invalid",
"MiddleName Invalid"
]
}
}
Если у вас было только одно сообщение об ошибке, вы все равно должны использовать список:
{
"error" : {
"SaveContactMethod": [
"FirstName Invalid"
]
}
}
Таким образом, когда вы загружаете JSON в код C#, он всегда будет иметь один и тот же тип, Dictionary<string,List<string>>
была ли одна ошибка или много.
Это Y в вашей проблеме XY. Вместо того, чтобы биться головой о стену "Я хочу иметь дубликаты ключей в JSON", найдите способ обойти стену: иметь один ключ со списком значений. И теперь вы можете делать то, что вам действительно нужно, то есть получать все сообщения об ошибках из вашей формы, используя только одно имя ключа для каждого сообщения об ошибке.
Нет, это невозможно.
Это будет неверно * JSON:
{
"error" : {
"SaveContactMethod":"FirstName Invalid",
"SaveContactMethod":"LastName Invalid",
"SaveContactMethod":"MiddleName Invalid"
}
}
Вы можете проверить это здесь:
Warning:Duplicate key, names should be unique.[Code 23, Structure 9]
Warning:Duplicate key, names should be unique.[Code 23, Structure 13]
* В зависимости от того, что вы называете действительным
Если вы действительно хотите пойти по этому пути, в соответствии с RFC 4627, вы можете использовать StringBuilder
учебный класс.
Поскольку вы, кажется, не понимаете, что означает " В зависимости от того, что вы называете действительным".
В случае если в объекте есть повторяющиеся строки имени, лексически предшествующие значения для одного и того же ключа должны быть перезаписаны.
Это значит: если вы получите три SaveContactMethod
х ты только хочешь "MiddleName Invalid"
в ECMA Script (JS). С сериализацией C# это было бы невозможно. Вам нужно написать свой собственный JsonSerializer для этого.