使用数组中的数组对 JSON 进行反序列化

Posted

技术标签:

【中文标题】使用数组中的数组对 JSON 进行反序列化【英文标题】:Desearalising JSON with arrays in arrays 【发布时间】:2021-02-17 15:33:23 【问题描述】:

我花了一段时间试图弄清楚如何对这个 JSON 文件进行消毒并获取每个产品

ID、姓名、收集费用和天气情况

我目前正在 C# 类中使用 Newtonsoft.Json 尝试此操作。

有人能指出我正确的方向吗? 非常感谢

对于 JSON 文本访问: https://pastebin.com/bkQwpsAy


    "_embedded": 
        "products": [
                "uuid": "74f1501f-4a52-490a-b2b9-668f16e2db95",
                "createdAt": "2020-04-20T13:44:22.000+00:00",
                "itemId": "DRN543",
                "altItemGroupId": "",
                "popularityScore": 101.22,
                "itemName": "Coca-Cola Bottles (GB) 6x1.5L",
                "jsonFriendlyItemName": "Coca-Cola Bottles (GB) 6x1.5L",
                "seoFriendlyItemName": "coca-cola-bottles-gb-6x1-5l",
                "brand": "Coca Cola",
                "imageLinks": ["https://jjproducts.global.ssl.fastly.net/jjfoodservice/image/upload/v1588074299/products/DRN543/_S/ggktoxjzbplky4uovec4.jpg"],
                "price": 9.99,
                "depth": 29.0,
                "height": 32.0,
                "itemNetWeight": 9.0,
                "jadMobileItemName": "Coca Cola (GB) 6x1.5L",
                "category1Id": "100005",
                "category2Id": "200261",
                "category3Id": "300194",
                "category4Id": "400084",
                "category5Id": "",
                "category1Name": "Drinks",
                "category2Name": "Soft Drinks",
                "category3Name": "Fizzy Drinks",
                "category4Name": "Cola",
                "category5Name": "",
                "origin": "United Kingdom",
                "catchOrigin": "",
                "productDescription": "",
                "sellingPoints": "Coca Cola\nCocaCola",
                "shelfLife": 135,
                "sizeOrCut": "6x1.5l",
                "qtyPerLayer": 20.0,
                "standardPalletQty": 80.0,
                "unitVolume": 17632.0,
                "width": 19.0,
                "allergensDeclaration": "",
                "storageCondition": "Store cool and dry.",
                "storedAt": "2020-11-03T23:52:28.789210Z",
                "branches": [
                        "locationId": "EN-MW",
                        "locationName": "Enfield Branch",
                        "warehouseArea": "DA",
                        "warehouseZone": "GZ"
                    , 
                        "locationId": "LS-MW",
                        "locationName": "Leicester Branch",
                        "warehouseArea": "DA",
                        "warehouseZone": "GZ"
                    
                ],
                "branchesBeforeLastUpdate": [
                        "locationId": "EN-MW",
                        "locationName": "Enfield Branch",
                        "warehouseArea": "DA",
                        "warehouseZone": "GZ"
                    , 
                        "locationId": "LS-MW",
                        "locationName": "Leicester Branch",
                        "warehouseArea": "DA",
                        "warehouseZone": "GZ"
                    
                ],
                "video": [],
                "categoryList": "[\"id\":\"100005\",\"name\":\"Drinks\",\"id\":\"200261\",\"name\":\"Soft Drinks\",\"id\":\"300194\",\"name\":\"Fizzy Drinks\"]",
                "categoryId": "100005,200261,300194",
                "categoryName": "Drinks,Soft Drinks,Fizzy Drinks",
                "categoryNormalised": "[Cola Drinks Fizzy Soft]",
                "productFeatures": ["Popular", "Ambient", "Vegan", "Vegetarian"],
                "unitSize": "1.5L",
                "unitPriceDivider": 0.16666,
                "unitPriceTypeDisplayText": "each",
                "offer": 
                    "itemId": "DRN543",
                    "promoForCc": false,
                    "promoTagId": "Monthly",
                    "promoTag": "Monthly Special Promotions",
                    "promoEnd": "31/12/2020",
                    "promoDisAmt": 0,
                    "promoDisPct": 0,
                    "promoDiscountText": [],
                    "id": "DRN543"
                ,
                "delivery": 
                    "price": 8.29,
                    "priceInc": 8.29,
                    "unitPriceDisplay": "£1.38 each",
                    "step": 1.0,
                    "max": 15.0,
                    "collection": false
                ,
                "collection": 
                    "price": 7.29,
                    "priceInc": 7.29,
                    "unitPriceDisplay": "£1.21 each",
                    "step": 1.0,
                    "max": 15.0,
                    "collection": true
                ,
                "previouslyPurchased": false,
                "favourite": false,
                "available": true,
                "new": false,
                "popular": true,
                "popularOnCategory1": true,
                "popularOnCategory2": true,
                "popularOnCategory3": true,
                "ageRestriction": false,
                "halal": false,
                "vegan": true,
                "vegeterian": true,
                "numberOfPackage": 6,
                "numberOfUnitsInPackage": 1.5,
                "unitType": "litre",
                "CCMAltItemGroup": "",
                "JJeBrand": "Coca Cola",
                "JadConsumableDepth": 0.0,
                "JadConsumableHeight": 0.0,
                "JadConsumableWidth": 0.0,
                "JJeCategory1Id": "100005",
                "JJeCategory2Id": "200261",
                "JJeCategory3Id": "300194",
                "JJeCategory4Id": "400084",
                "JJeCategory5Id": "",
                "JJeCategory1": "Drinks",
                "JJeCategory2": "Soft Drinks",
                "JJeCategory3": "Fizzy Drinks",
                "JJeCategory4": "Cola",
                "JJeCategory5": "",
                "JJeCookingInstruction": "Best served chilled.",
                "JJeIngredients": "Carbonated Water, Sugar, Colour (Caramel E150d), Phosphoric Acid, Natural Flavourings including Caffeine.",
                "JadIngredientshtml": "Carbonated Water, Sugar, Colour (Caramel E150d), Phosphoric Acid, Natural Flavourings including Caffeine.",
                "JJeOrigin": "United Kingdom",
                "JadCatchOrigin": "",
                "JJeProductDescription": "",
                "JJeSellingPoints": "Coca Cola\nCocaCola",
                "JJeShelfLife": 135,
                "JJeSizeOrCut": "6x1.5L",
                "JadAllergensDeclaration": "",
                "JadStorageCondition": "Store cool and dry.",
                "JJeEnergyKJ": 180.0,
                "JJeEnergyKCAL": 42.0,
                "JJeFatG": "0",
                "JadFatSaturatesG": "0",
                "JJeCarbohydrateG": "10.6",
                "JadCarbohydrateSugarsG": "10.6",
                "JJeProteinG": "0",
                "JadSodiumG": "0",
                "IsAgeRestriction": false,
                "IsHalal": false,
                "IsVegan": true,
                "IsVegeterian": true
            
        ]
    ,
    "_links": 
        "maintenance-message": 
            "href": "[]"
        ,
        "announcement-message": 
            "href": "[]"
        
    ,
    "page": 
        "size": 12,
        "totalElements": 18,
        "totalPages": 2,
        "number": 0
    

【问题讨论】:

@JaromandaX 抱歉,我忘了提到我在课堂上收到了相同的数据,但 JSON 数据。堆栈溢出不允许我显示整个 JSON 文本,谢谢:) @JaromandaX 生病添加一些 json @JaromandaX 谢谢你,我没有意识到你可以做到这一点,我是 JSON 新手,对网络抓取还很陌生 你的问题不是数组中的数组...问题是 JSON 中的 JSON ...问题是 categoryList 只是一个字符串(作为 JSON 格式)所以你必须解析它解析整个 JSON 后的值 @dbc 谢谢,因为我只需要 6 个值,所以我决定将对象转换为动态数据类型,因此我不必考虑所有字段 【参考方案1】:
        public static List<JJs.ITEMS> JJSGetProductHTML(String Term)
    
        string url = "https://www.website.com/api/product-search-agg/api/v1/product/websearch?b=DG-MW&page=0&q=" + Term+ "&size=12&sortType=search&format=json";
        WebClient WC = new WebClient();
        string JSON = WC.DownloadString(url);
        var onject,= JsonConvert.DeserializeObject<dynamic>(JSON);
        string s = onject._embedded.products[0].ToString();
        List<JJs.ITEMS> products = new List<JJs.ITEMS>();
        foreach (var m in onject._embedded.products)
        
            JJs.ITEMS newitem = new JJs.ITEMS();
            newitem.Name = m.jsonFriendlyItemName.ToString();
            newitem.itemId = m.itemId.ToString();
            newitem.price = m.collection.price.ToString();
            try
             m.offer.ToString(); newitem.Promoend = m.offer.promoEnd.ToString(); newitem.Promo = true;  
            catch 
             newitem.Promo = false; ;
            products.Add(newitem);
        

        return products;
    

因为我不想要所有字段,所以我对其进行了序列化,然后使用“.jsonFriendlyItemName”、“.itemId”.. 仅获取我正在寻找的值

感谢@JaromandaX、@Peter B 和 @dbc 的帮助

【讨论】:

以上是关于使用数组中的数组对 JSON 进行反序列化的主要内容,如果未能解决你的问题,请参考以下文章

使用巨大的 int JSON 数组更快地进行 JSON 反序列化

在反序列化时如何忽略JSON对象数组中的空白数组?

Json数组反序列化

使用空白数组反序列化 JSON 对象

在 C# 中从 JSON 反序列化数组

如何使用 Newtonsoft.Json 正确反序列化数组中的嵌套对象? [复制]