Подтвердить что ты не робот

Удаление десериализации вложенной структуры 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; }
}
4b9b3361

Ответ 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 - здесь. Очень легко и полезно.

После - если вы все еще настаиваете, вы можете обернуть его в новый класс.