Уничтожить 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() для его преобразования.