2015-05-05 4 views
0

Я пытаюсь десериализовать некоторые JSON в список, используя JSON.NET; Однако, существует ряд в пути:Deserialize JSON с числовыми строками

Вот это JSON:

"payment_info": { 
    "fb_id": "", 
    "order_items": { 
     "0": { 
     "product_id": "4534", 
     "type": "product", 
     "shipping_cost_per_item": "1.00", 
     "quantity": "3", 
     "price_each": "10.00", 
     "price_total": "30.00" 
     } 
    }, 

Вот мой класс:

public class OrderItem 
    { 
     public string product_id { get; set; } 
     public string type { get; set; } 
     public string shipping_cost_per_item { get; set; } 
     public string quantity { get; set; } 
     public string price_each { get; set; } 
     public string price_total { get; set; } 
    } 

    public class OrderItems 
    { 
     public List<OrderItem> Items { get; set; } 
    } 

Как сказать конвертер игнорировать 0? Для каждого элемента заказа будет 1,2,3.

ответ

1

Здесь я вижу несколько вопросов.

Во-первых, ваш JSON недействителен; он кажется лишь фрагментом. Действительный, полный JSON будет выглядеть следующим образом. (Я добавил вмещающих скобки, удалил Запятую и сбалансирован скобка для payment_info объекта.)

{ 
    "payment_info": { 
     "fb_id": "", 
     "order_items": { 
      "0": { 
       "product_id": "4534", 
       "type": "product", 
       "shipping_cost_per_item": "1.00", 
       "quantity": "3", 
       "price_each": "10.00", 
       "price_total": "30.00" 
      } 
     } 
    } 
} 

Поскольку ваш фрагмент заключен в объекте, вам потребуется соответствующий класс верхнего уровня для десериализации в. Для этого класса требуется свойство payment_info, чтобы сохранить класс OrderItems. (Я бы рекомендовал переименовать этот класс PaymentInfo, если это возможно, чтобы избежать путаницы.)

Во-вторых, в Items свойство внутри OrderItems класса не соответствует JSON. В JSON он называется order_items. Поскольку они не совпадают, вы получите нулевое значение при десериализации. Вам необходимо переименовать свойство или использовать атрибут [JsonProperty], чтобы указать имя свойства JSON.

В-третьих, свойство order_items в вашем JSON - это не список; это объект. Поэтому вы получите сообщение об ошибке, если попытаетесь десериализовать его в список (как только вы исправите имя свойства). Обычным решением для этой ситуации является использование Dictionary<string, T> вместо List<T>.

Собираем все вместе, если вы сделаете свои классы, как это:

public class RootObject 
{ 
    public PaymentInfo payment_info { get; set; } 
} 

public class PaymentInfo 
{ 
    public Dictionary<string, OrderItem> order_items { get; set; } 
} 

public class OrderItem 
{ 
    public string product_id { get; set; } 
    public string type { get; set; } 
    public string shipping_cost_per_item { get; set; } 
    public string quantity { get; set; } 
    public string price_each { get; set; } 
    public string price_total { get; set; } 
} 

Тогда вы можете десериализации, как это:

RootObject root = JsonConvert.DeserializeObject<RootObject>(json); 

foreach (OrderItem item in root.payment_info.order_items.Values) 
{ 
    Console.WriteLine("product id: " + item.product_id); 
    Console.WriteLine("type: " + item.type); 
    Console.WriteLine("shipping cost per item: " + item.shipping_cost_per_item); 
    Console.WriteLine("quantity: " + item.quantity); 
    Console.WriteLine("price per item: " + item.price_each); 
    Console.WriteLine("total price: " + item.price_total); 
} 

Скрипки: https://dotnetfiddle.net/e0t8gX

Смежные вопросы