Jestem nowy w przetwarzaniu JSON przez NewtonSoft na C#. Mam następujący kod JSON i próbuję uzyskać wszystkie orderIds i orderNumbers. Wypróbowałem następujący kod. Ale w obu przypadkach nie mogę uzyskać dostępu ...

0
Kim 23 czerwiec 2021, 22:28

4 odpowiedzi

Najlepsza odpowiedź

Udało mi się działać w następujący sposób:

        var jObj = JObject.Parse(json);

        JArray orders = (JArray)jObj["orders"];
        foreach (JToken order in orders)
        {
            string orderId = (string)order["orderId"];
            string orderNumber = (string)order["orderNumber"];
        }
1
Kim 23 czerwiec 2021, 20:23

Instrukcja pętli for wydaje się być błędna, ponieważ dynJson jest obiektem, a nie tablicą. Musisz przejść przez dynJson.orders, jak poniżej.

dynamic dynJson = JsonConvert.DeserializeObject(data);
    foreach (var item in dynJson.orders)
    {
        //Console.WriteLine("{0} {1} \n", item["orders"].orderId, 
                            //item["orders"].orderNumber);
        Console.WriteLine("{0} {1} \n", item.orderId,
                           item.orderNumber);
    }
}

Powyższy kod zostanie wydrukowany

123 234 
567 789 
223 334
0
Vinit 23 czerwiec 2021, 19:49

Możesz to zrobić w sposób silnie napisany. W takim przypadku musisz stworzyć kilka klas, które mogą być używane do przechowywania twoich informacji.

Zaczynając od najgłębszego końca hierarchii, najpierw pozycja:

public class Item
{
    public int orderItemId { get; set; }
    public string lineItemKey { get; set; }
    public string sku { get; set; }
    public string name { get; set; }
}

Następnie informacje o rachunku do:

public class BillTo
{
    public string name { get; set; }
    public string Street { get; set; }
}

Następnie zamówienie, które ma BillTo i kilka pozycji:

public class Order
{
    public int orderId { get; set; }
    public string orderNumber { get; set; }
    public BillTo billTo { get; set; }
    public List<Item> items { get; set; }
}

A potem, ponieważ Twój JSON zaczyna się od obiektu zawierającego kilka zamówień:

public class Orders
{
    public List<Order> orders { get; set; }
}

Jeśli to uruchomisz:

var result = JsonConvert.DeserializeObject<Orders>(theJson);
foreach (var order in result.orders)
{
    Debug.WriteLine($"Order #{order.orderId}: For {order.billTo.name}, {order.items.Count} items");
}

Skończysz z:

Order #123: For John1 Doe1, 1 items
Order #567: For John2 Doe2, 1 items
Order #223: For John3 Doe4, 1 items
0
Flydog57 23 czerwiec 2021, 20:12

Chociaż odpowiedź Vinita bez wątpienia zadziała, generalnie staramy się unikać używania dynamic w C#. Kiedy używamy dynamicznego, usuwa to niektóre zalety kodowania silnie typizowanego, co jest jedną z największych zalet C#.

Zamiast tego możemy zdefiniować typy do reprezentowania naszych danych:

class PostedOrders
{
    public List<Order> Orders { get; set; }
}

class Order
{
    public int OrderId { get; set; }

    public string OrderNumber { get; set; }

    public BillRecipient BillTo { get; set; }

    public List<Item> Items { get; set; }
}

class BillRecipient
{
    public string Name { get; set; }
  
    public string Street { get; set; } 
}

class Item
{
    public int OrderItemId { get; set; }

    public string LineItemKey { get; set; }

    public string Sku { get; set; }

    public string Name { get; set; }
}

Teraz, gdy wszystko zdefiniowaliśmy, uzyskujemy pełne korzyści z Intellisense, uzupełniania kodu, sprawdzania typów i łatwej refaktoryzacji.

Aby pracować z JSON, możemy po prostu iterować po tablicy. Aby zapisać to w konsoli, możemy użyć interpolacji łańcuchów, która ma ładniejszą składnię niż łańcuchy starego formatu.

PostedOrders orders = JsonConvert.DeserializeObject<PostedOrders>(json);

foreach (var order in orders.Orders)
{
    Console.WriteLine($"{order.OrderId} {order.OrderNumber}");
}
-1
mason 23 czerwiec 2021, 20:15