Как десериализовать JSON с помощью C # - PullRequest
2 голосов
/ 02 июня 2011

В настоящее время я использую Json.Net для десериализации моего 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.String []'.

Как я могу это исправить? (используя Json.Net или любую другую библиотеку)

Ответы [ 4 ]

3 голосов
/ 02 июня 2011

Проблема в том, что вы пытаетесь преобразовать словарь в массив. Попробуйте заменить string[] на Dictionary<string, string>.

3 голосов
/ 02 июня 2011

Errors не является массивом строк, это object с UserName и EmailAddress в качестве его свойства.

{
    "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.

1 голос
/ 28 июля 2011

Использование 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();
        }
    }
}
1 голос
/ 02 июня 2011

Это потому, что ваши "ошибки" в вашем 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"]}

В противном случае вам может потребоваться некоторое промежуточное отображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...