Как десриализовать JSON с помощью C#

#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();
        }
    }
}