Уничтожить JSON с динамическими объектами

У меня есть объект JSON, который поставляется с длинным списком кодов областей. К сожалению, каждый код области является именем объекта в списке в объекте Data. Как создать класс, который позволит RestSharp десериализовать контент?

Вот как выглядит мой класс сейчас:

public class phaxioResponse
{
    public string success { get; set; }
    public string message { get; set; }
    public List<areaCode> data { get; set; }

    public class areaCode
    {
        public string city { get; set; }
        public string state { get; set; }
    }
}

И здесь содержимое JSON:

{
    success: true
    message: "277 area codes available."
    data: {
        201: {
            city: "Bayonne, Jersey City, Union City"
            state: "New Jersey"
        }
        202: {
            city: "Washington"
        state: "District Of Columbia"
        } [...]
}

Ответ 1

Поскольку этот JSON не дружит с С#, мне нужно было немного взломать, чтобы он вышел правильно. Однако результат довольно приятный.

var json = JsonConvert.DeserializeObject<dynamic>(sampleJson);
var data = ((JObject)json.data).Children();
var stuff = data.Select(x => new { AreaCode = x.Path.Split('.')[1], City = x.First()["city"], State = x.Last()["state"] });

Этот код будет генерировать анонимный тип, который лучше всего представляет данные. Однако анонимный тип можно легко заменить на ctor для более нормального класса DTO.

Результат выглядит примерно так:

Deserialization Output

Ответ 2

ваш json неверен, но если вы его исправите, вы можете использовать инструмент json-to-csharp, такой как http://json2csharp.com/ для генерации ваших классов:

public class __invalid_type__201
{
    public string city { get; set; }
    public string state { get; set; }
}

public class Data
{
    public __invalid_type__201 __invalid_name__201 { get; set; }
}

public class RootObject
{
    public bool success { get; set; }
    public string message { get; set; }
    public Data data { get; set; }
}

Ответ 3

Я ничего не знаю о RestSharp, но если вы используете Newtonsoft на стороне сервера, вы можете просто передать JObject в свой метод. Затем вы можете опросить объект, чтобы узнать, какой тип объекта он действительно есть, и использовать JObject.ToObject() для его преобразования.