2015-02-19 2 views
1

я получил следующие данные JSonJson.Net - Deserialize объект с «динамическими» свойствами

{ 
    "HasErrors": false, 
    "Includes": { 
     "Products": { 
      "091006": { 
       "hej" : "tja" 
      }, 
      "091026": { 
       "hej" : "tjafsafsa" 
      } 
     } 
    } 
} 

Под динамическим JSON я имею в виду, что propertys на продукты класса меняется, так что я не могу жёстко их в C# класса так же, как и с «HasErrors».

Пример:

{ 
    "HasErrors": false, 
    "Includes": { 
     "Products": { 
      "091006": { 
       "hej" : "tja" 
      }, 
      "091026": { 
       "hej" : "tjafsafsa" 
      } 
     } 
    } 
} 

Другой пример:

{ 
    "HasErrors": false, 
    "Includes": { 
     "Products": { 
      "091126": { //CHANGED 
       "hej" : "tja" 
      }, 
      "091043226": { //CHANGED 
       "hej" : "tjafsafsa" 
      } 
     } 
    } 
} 

Я создал следующие классы в .NET

Response.cs

public class Response<T> where T : new() 
{ 
    [JsonProperty("hasErrors")] 
    public bool HasErrors { get; set; } 

    [JsonProperty("includes")] 
    public Includes<T> Includes { get; set; } 
} 

Includes.cs

public class Includes<T> where T : new() 
{ 
    [JsonProperty("products")] 
    public ProductRoot Products { get; set; } 
} 

ProductRoot.cs

public class ProductRoot 
{ 
    [JsonProperty("products")] 
    public Dictionary<string, Product> Products { get; set; } 
} 

Product.cs

public class Product 
{ 
    [JsonProperty("hej")] 
    public string Hej { get; set; } 
} 

Я затем попытаться Deserialize это так:

var hej = JsonConvert.DeserializeObject<Response<Product>>(json_from_above_as_string); 

И тогда я получаю эту ошибку:

Не удалось литым или конвертировать из System.String в www.Models.Externals.Product.

[JsonSerializationException: значение преобразования ошибки «091006» для ввода «www.Models.Externals.Product». Path 'Includes.ProductsOrder [0]', строка 1, позиция 15173.]

Вы, ребята, знаете, что я делаю неправильно?

+0

Как работает динамика JSON? Не всегда ли это следует за этой структурой? Это должно быть довольно простой бит JSON для десериализации. – mason

+0

Ах, извините, да, это соответствует той же структуре, но продукты отличаются друг от друга, 091006 иногда может быть 091009 или 091012. Поэтому я не могу просто добавить тезисы как свойства в классе C#, вы меня понимаете? Я обновил свой пост. – JOSEFtw

ответ

1

Я экземпляр объекта типа <Response<Product>> успешно и сериализовать его, чтобы получить чувство о том, что происходит под капотом и, в качестве примера, в JSON я получаю из нее выглядит следующим образом:

{ 
    "hasErrors":false, 
    "includes":{ 
     "products":{ 
      "products":{ 
       "091006":{ 
        "hej":"tja" 
       } 
      } 
     } 
    } 
} 

Это показывает, что ваш JSON просто не женятся с объектной моделью. Вы можете сделать пару вещей. Либо измените формат JSON на что-то вроде выше, либо измените модель объекта на следующее:

public class Response<T> where T : new() 
{ 
    [JsonProperty("hasErrors")] 
    public bool HasErrors { get; set; } 

    [JsonProperty("includes")] 
    public Includes<T> Includes { get; set; } 
} 

public class Includes<T> where T : new() 
{ 
    [JsonProperty("products")] 
    public Dictionary<string, T> Products { get; set; } 
} 

public class Product 
{ 
    [JsonProperty("hej")] 
    public string Hej { get; set; } 
} 
+0

Да, я решил это как раз перед тем, как ты начал, но я дам тебе согласие, спасибо человеку! – JOSEFtw

0

Я решил это, удалив класс ProductRoot.

Он теперь выглядит следующим образом:

public class Response<T> where T : new() 
{ 
    [JsonProperty("hasErrors")] 
    public bool HasErrors { get; set; } 

    [JsonProperty("includes")] 
    public Includes<T> Includes { get; set; } 
} 

public class Includes<T> where T : new() 
{ 
    [JsonProperty("products")] 
    public Dictionary<string, Product>Products { get; set; } 
} 
Смежные вопросы