Удаление десериализации вложенной структуры JSON в сплющенный класс с помощью Json.NET с помощью аннотаций
Можно ли использовать аннотацию JsonProperty для сопоставления вложенного свойства Json с не-вложенным членом .NET? Скажем, у вас есть Json вот так:
{
"id":9999,
"created_date":"Thu, 23 Jun 2011 12:56:24 +0000",
"pos":{
"type":"someType",
"coordinates":[
59.323,
18.0654
]
}
}
и хотите десериализовать его в сплющенный класс MyClass, используя
JsonConvert.DeserializeObject<MyClass>(jsonstr);
Можно использовать аннотации для сопоставления списка координат Json с Lat и Lng в следующем классе:
public class MyClass {
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("created_date")]
public DateTime Created { get; set; }
[JsonProperty("????")]
public float Lat { get; set; }
[JsonProperty("?????")]
public float Lng { get; set; }
}
Просто любопытно. Я всегда могу определить класс, как это, и кажется, что он работает нормально:
public class MyClass {
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("date_created")]
public DateTime Created { get; set; }
[JsonProperty("pos")]
public PosClass Pos { get; set; }
}
public class PosClass
{
public List<float> coordinates { get; set; }
}
Ответы
Ответ 1
Из личного опыта я боролся, прежде чем пытаться повторно использовать свои сущности для общения (JSON, XML... и т.д.), но после более пристального внимания к существующим шаблонам я обнаружил, что "объекты передачи данных" в дополнение к внутренним/хранилищам, которые у вас уже есть, освободят мои модели связи, и единственная стоимость, которую я заплатил, заключалась в том, чтобы согласиться с ручным, но прямолинейным, усилие ручного кодирования между ними.
Если вы предпочтете придерживаться того, что у вас есть, и производительность не имеет большого значения, тогда .NET-отражение - ваш друг.
Ответ 2
Для действительно сложных ситуаций JSON мне очень нравится подход к ручному сопоставлению, который Demis Bellot взял с ServiceStack.Text. Это позволяет мне передать httpResponse.Content в JsonConverter.Convert(строка json).
Это имеет дополнительное преимущество, чтобы ваши объекты модели были скрипучивы.
var place = JsonObject.Parse(JsonCentroid)
.Object("place")
.ConvertTo(x => new Place
{
WoeId = x.Get<int>("woeid"),
PlaceTypeName = x.Get(""),
PlaceTypeNameAttrs = x.Object("placeTypeName attrs"),
Name = x.Get("Name"),
BoundingBox = x.Object("boundingBox")
.ConvertTo(y => new BoundingBox
{
SouthWest = y.Object("southWest").ConvertTo(toCentroid),
NorthEast = y.Object("northEast").ConvertTo(toCentroid)
}),
});
Вы можете увидеть полный тест здесь.
Ответ 3
Я думаю, это лучше, если вы не сгладите его вообще.
Существует несколько причин, по которым НЕ делать это:
- если в какой-то момент вам понадобятся поля с тем же именем.
- если вы хотите изменить атрибут, вам придется восстановить объект JSON
с нуля.
Лучший вариант для вас - немного прочитать об обходе данных с помощью JSon - здесь.
Очень легко и полезно.
После - если вы все еще настаиваете, вы можете обернуть его в новый класс.