2016-09-28 83 views
0

我收到以下JSON字符串。它是產品規格的一部分。數據表示標題(「常規」)和Key值對中的項目。C#中的循環Json屬性

我不想硬編碼任何性質,例如一般情況下,顯示功能和應該能夠

  1. 檢索頁眉上的密鑰值對
  2. 迭代。

到目前爲止,我有以下代碼

foreach (var SpecList in objAPIProduct.categorySpecificInfoV1.specificationList) 
{  
    foreach(dynamic SpecItem in SpecList.General) 
    { 
     Console.WriteLine(SpecItem.key); 
     Console.WriteLine(SpecItem.value[0]); 
    }  
} 

我想擺脫,我在內部foreach循環已經硬編碼,使環通用於所有屬性中的「常規」屬性的。 這裏是JSON的,我有

{ 
    "General": [{ 
     "key": "Sales Package", 
     "value": ["Laptop, Power Adapter, Warranty Document"] 
    }, 
    { 
     "key": "Model Number", 
     "value": ["3558"] 
    }, 
    { 
     "key": "Part Number", 
     "value": ["Z565103UIN9"] 
    }, 
    { 
     "key": "Model Name", 
     "value": ["Inspiron 15"] 
    }, 
    { 
     "key": "Series", 
     "value": ["Inspiron"] 
    }, 
    { 
     "key": "Color", 
     "value": ["Black"] 
    }, 
    { 
     "key": "Type", 
     "value": ["Notebook"] 
    }, 
    { 
     "key": "Suitable For", 
     "value": ["Everyday Use"] 
    }, 
    { 
     "key": "Battery Backup", 
     "value": ["Upto 3.5 hours"] 
    }, 
    { 
     "key": "Battery Cell", 
     "value": ["4 cell"] 
    }] 
}, 
{ 
    "Processor and Memory Features": [{ 
     "key": "Processor Brand", 
     "value": ["Intel"] 
    }, 
    { 
     "key": "Processor Name", 
     "value": ["Core i3"] 
    }, 
    { 
     "key": "Graphic Processor", 
     "value": ["Intel HD Graphics 5500"] 
    }, 
    { 
     "key": "SSD", 
     "value": ["No"] 
    }, 
    { 
     "key": "RAM", 
     "value": ["4 GB"] 
    }, 
    { 
     "key": "RAM Type", 
     "value": ["DDR3"] 
    }, 
    { 
     "key": "HDD Capacity", 
     "value": ["500 GB"] 
    }, 
    { 
     "key": "Processor Variant", 
     "value": ["5005U"] 
    }, 
    { 
     "key": "Clock Speed", 
     "value": ["2 GHz"] 
    }, 
    { 
     "key": "Memory Slots", 
     "value": ["1 Slot"] 
    }, 
    { 
     "key": "Expandable Memory", 
     "value": ["Upto 4 GB"] 
    }, 
    { 
     "key": "RAM Frequency", 
     "value": ["1600 MHz"] 
    }, 
    { 
     "key": "Cache", 
     "value": ["3 MB"] 
    }, 
    { 
     "key": "RPM", 
     "value": ["5400"] 
    }] 
} 
+0

使用'JSON.Net'和簡單的[Deserialize](http://www.newtonsoft.com/json/help/html/deserializeobject.htm)。 –

+0

它被反序列化。 – John

回答

0

在嘗試了很多選項後,我發現在使用Json.Net或JavascriptSerialiser時無法獲得屬性的「名稱」。

最後,我用這個線索的幫助下 -

Deserialize JSON into C# dynamic object?

其中的人已使用System.Web.Helpers建議和它完美的作品在我的情況。

這裏是我的最終代碼: dynamic objAPIProduct = Json.Decode(json);

List<ProductSpecification> objProductSpecificationList = new List<ProductSpecification>(); 
      ProductSpecification objProductSpecification; 

      foreach (var SpecListCategoryList in objAPIProduct.categorySpecificInfoV1.specificationList) 
      { 
       foreach (var SpecCategory in SpecListCategoryList) 
       { 

        DynamicJsonArray objListitems = SpecCategory.Value; 

        for (int i = 0; i < objListitems.Length; i++) 
        { 
        objProductSpecification = new ProductSpecification(); 
        objProductSpecification.SpecificationHead = SpecCategory.Key; 
        objProductSpecification.SpecificationKey = objListitems[i].key; 
        objProductSpecification.SpecificationValue = objListitems[i].value[0]; 
        objProductSpecificationList.Add(objProductSpecification); 
        } 
       } 

      } 
1

在現場json2csharp.com你可以爲你的JSON生成類。

public class General 
{ 
    public string key { get; set; } 
    public List<string> value { get; set; } 
} 

public class RootObject 
{ 
    public List<General> General { get; set; } 
} 

和反序列化JSON它使用JSON.NET到:

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

和:

foreach(General g in ro.General) 
{ 
    string k = g.key; 
} 
+0

Json已使用JavascriptSerializer反序列化。這是部分代碼 - var serializer = new JavaScriptSerializer(); serializer.RegisterConverters(new [] {new DynamicJsonConverter()}); model = serializer。反序列化(json,typeof(object)); 在我的原代碼中的代碼,它正在工作 - 但我有一種「硬編碼」屬性「一般」 - 我不想。由於產品名稱會根據產品數據而不斷變化。 – John

+0

在內部循環 - foreach(動態SpecItem在SpecList.General) 我想擺脫這裏.General – John

+0

@John JSON.NET更好,即使微軟在MVC中使用JSON.NET。如果你可以改變JavascriptSerializer到JSON.NET – BWA

0

重寫你的SpecList類這樣

public class SpecList : Dictionary<string, List<SpecItem>> 
{ 
} 

從此,你將能夠acc這是你的一般財產

foreach (var SpecList in objAPIProduct.categorySpecificInfoV1.specificationList) 
{ 
    foreach(var key in SpecList.Keys) 
    { 
     foreach(var SpecItem in SpecList[key]) 
     { 
      Console.WriteLine(SpecItem.key); 
      Console.WriteLine(SpecItem.value[0]); 
     }  
    } 
} 

希望它有幫助。

+0

我不想使用「常規」一詞,而是可以以某種方式使用索引來獲取它。可能類似於[code] var general = SpecList [0] [/ code]但是這不起作用 – John

+0

SpecList.Keys會爲你提供正確的鍵 – IamNguele

+0

它在第二個foreach中給出SpecList.Keys上的NULL錯誤 - 即使當SpecList在立即窗口中顯示 - {General:[key:「Model Number」,value:[「E484」]},key:「Model Name」,value:[「Canvas 6 Pro」]},key:「Color」,值:[「Black」]},鍵:「瀏覽類型」,值:[「智能手機」]},鍵:「SIM類型」,值:[「雙SIM」]},鍵:「操作系統」 :[「Android」]},鍵:「操作系統版本名稱」,值:[「Lollipop」]},鍵:「操作系統版本號」,值:[「5.1」]},鍵: ,value:[「16 GB」]},key:「RAM」,value:[「4 GB」]},key:「.... – John