Десериализация вложенной структуры JSON в плоский класс с помощью Json.NET с использованием аннотаций - PullRequest
23 голосов
/ 24 июня 2011

Можно ли использовать аннотацию 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 сЛат и Лнг в классе ниже:

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; }
}

Ответы [ 3 ]

1 голос
/ 22 января 2015

Исходя из личного опыта, я изо всех сил пытался повторно использовать свои сущности для связи (JSON, XML ... и т. Д.), Но, уделив более пристальное внимание существующим шаблонам, я обнаружил, что имея "объекты передачи данных« в дополнение к имеющимся у вас внутренним объектам / хранилищам освободит мои модели общения, и единственной платой, которую я заплатил, было согласие выполнить ручное, но прямое усилие по ручному кодированию между ними.

Если вы предпочитаете придерживаться того, что у вас есть, и производительность не составляет большого значения, тогда .NET отражение - ваш друг.

0 голосов
/ 11 февраля 2013

Думаю, будет лучше, если вы вообще не будете сглаживать.Есть несколько причин, по которым НЕ следует это делать:

  1. , если в какой-то момент вам понадобятся поля с одинаковым именем.
  2. , если вы хотите изменить атрибут, выВам придется реконструировать объект JSON с нуля.

Лучший вариант для вас - прочитать немного о сканировании данных с использованием JSon - здесь .Очень просто и полезно.

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

0 голосов
/ 07 августа 2011

Для действительно сложных JSON-ситуаций мне очень нравится подход ручного отображения, который Демис Белло использовал с ServiceStack.Text . Это позволяет мне передавать httpResponse.Content методу JsonConverter.Convert (string 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)
            }),
});

Вы можете увидеть полный тест здесь .

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