#c# #asp.net #json #serialization
#c# #asp.net #json #сериализация
Вопрос:
В настоящее время я использую Json.Сеть для десериализации моего JSON. Теперь у меня следующая ситуация:
Я получаю следующий ответ JSON:
{"Success":false,"Errors":{"UserName":"User Name already registered","EmailAddress":"Email Address already registered"}}
Я хочу разобрать его в этот тип:
public class CustomJsonResult
{
public bool Success { get; set; }
public string[] Errors { get; set; }
}
Используя Json.net Я пытался сделать это:
CustomJsonResult regResult = JsonConvert.DeserializeObject<CustomJsonResult>(json);
Но это не работает, я получаю сообщение об ошибке Не удается десериализовать объект JSON в тип ‘System.Строка[]’.
Как я могу это исправить? (используя Json.Net или любая другая библиотека)
Ответ №1:
Проблема в том, что вы пытаетесь преобразовать словарь в массив. Попробуйте заменить ваш string[]
на Dictionary<string, string>
.
Комментарии:
1. @Роберт Дондо имеет в виду, что у
Error
объекта могут быть разные поля или что вError
поле в JSON может быть большеErrors
объектов?2. Объект Error может содержать дополнительные (или меньшее количество) полей. Я не рассматривал это, когда создавал первоначальный пост.
3. Что ж, тогда это лучший ответ для удовлетворения того, что вам нужно 🙂
Ответ №2:
Errors
это не массив строк, это свойство object
with UserName
и EmailAddress
as.
{
"Success":false,
"Errors":{
"UserName":"User Name already registered",
"EmailAddress":"Email Address already registered"
}
}
ну, вы можете создать другой класс для хранения сообщения об ошибке
public CustomJsonError
{
public string UserName { get; set; }
public string EmailAddress { get; set; }
}
Затем выполните рефакторинг класса
public class CustomJsonResult
{
public bool Success { get; set; }
public CustomJsonError Errors { get; set; } // I'm not sure if the property should be named as Errors
}
Кстати, будет ли ошибка содержать массив / список ошибок?
Обновить
Ну, вы можете использовать Dictionary<string, string>
(см. Другой ответ) или создать пользовательский класс для ошибки. Смотрите http://james.newtonking.com/projects/json/help/SerializingCollections.html для сериализации и десериализации коллекции в JSON и из него.
Ответ №3:
Это потому, что ваши «Ошибки» в вашем JSON не соответствуют тому, что он пытается десериализовать. Это должно быть что-то вроде этого:
public class CustomJsonResult
{
public bool Success { get; set; }
public ErrorType[] Errors { get; set; }
}
public class ErrorType
{
public string UserName {get;set;}
public string EmailAddress {get;set;}
}
Если вы хотите изменить JSON, чтобы он соответствовал, он должен выглядеть примерно так:
{"Success":false, "Errors": ["User Name already registered", "Email Address already registered"]}
В противном случае вам может понадобиться некоторое промежуточное сопоставление.
Ответ №4:
Использование JavaScriptSerializer из стандартной библиотеки .NET framework System.Web.Extensions:
using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var dict = new JavaScriptSerializer().Deserialize<Dictionary<string,int>>("{ a: 1, b: 2 }");
Console.WriteLine(dict["a"]);
Console.WriteLine(dict["b"]);
Console.ReadLine();
}
}
}