2016-03-07 105 views
2

嘿所有我需要一些幫助,通過下面的JSON字符串循環:的Json不知道結構

{ 
    "application_uid" : "3912d337-b797-4508-8c95-c76df8888ada", 
    "formId" : "F_Form1", 
    "recordCount" : 1, 
    "items" : 
    [ 
     { 
    "lastModified" : "2015-12-11T20:07:25.774Z", 
    "lastModifiedBy" : 
     { 
     "displayName" : "Anonymous Guest User", 
     "email" : "", 
     "login" : "Anonymous Guest User" 
     }, 
    "created" : "2015-12-11T20:07:25.774Z", 
    "createdBy" : 
     { 
     "displayName" : "Anonymous Guest User", 
     "email" : "", 
     "login" : "Anonymous Guest User" 
     }, 
    "draft_ownerid" : "", 
    "flowState" : "ST_End", 
    "id" : 20, 
    "uid" : "5928bb18-5b53-43f9-8831-baab042e1ca2", 
    "F_ReceivedYorN" : "Y", 
    "F_ContractNumber" : "5556420121", 
    "F_FileNumber" : "0630250", 
    "F_SubscriberLastName" : "JEFFERY", 
    etc etc... 

問題的存在是該名稱可以更改F_ReceivedYorNF_ContractNumberF_FileNumber

我知道如何通過循環獲取值,但只有定義對象的名稱。唯一的名稱將保持靜態,無論是什麼flowState,iduid值。

即使我不知道他們將被稱爲什麼,我該如何循環每個名稱?

UPDATE

假想的解決方案並不能幫助其不會像我上面的例子。 REOPEN

+0

有名稱的字段可以是一個固定的名單?如果名稱不斷變化,您如何確定您選擇了正確的數據? –

+0

@ Mr.Llama什麼,我只是在尋找的是名稱和值。我可以從另一個API拉取名稱列表,並且可以將該名稱與該列表中的名稱進行匹配。 – StealthRT

+0

您可以使用['[JsonExtensionData]'](http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonExtensionDataAttribute.htm)。參見[與已知和未知的領域反序列化JSON(https://stackoverflow.com/questions/15253875)或[反序列化JSON對象的一部分並用剩餘性質完好序列回](https://stackoverflow.com/questions/26937606) – dbc

回答

1

您的JSON由包含"items"屬性的根對象組成,該對象包含具有標準屬性和可變屬性的對象數組。您需要先獲取每個項目中的所有屬性名稱和值,而無需事先知道它們。

你已經標記了你的問題所以我會在C#中回答。你有幾個選擇。

使用[JsonExtensionData]

Json.NET通過添加[JsonExtensionData]到自定義屬性名稱/值對的字典支持反序列化和任意JSON性質的重新序列成POCO:

public class Item 
{ 
    public Item() { this.CustomFields = new Dictionary<string, JToken>(); } 

    public string flowState { get; set; } 
    public long id { get; set; } 
    public Guid uid { get; set; } 

    [JsonExtensionData] 
    public IDictionary<string, JToken> CustomFields { get; private set; } 
} 

public class RootObject 
{ 
    public RootObject() { this.items = new List<Item>(); } 

    public Guid application_uid { get; set; } 
    public string formId { get; set; } 
    public int recordCount { get; set; } 
    public List<Item> items { get; set; } 
} 

然後您可以循環顯示自定義屬性的名稱和值,如下所示:

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

     foreach (var item in root.items) 
     { 
      Console.WriteLine(string.Format("Showing custom properties for Item id {0}, uid {1}, flowState {2}", item.id, item.uid, item.flowState)); 
      { 
       foreach (var field in item.CustomFields) 
       { 
        Console.WriteLine(string.Format(" Field: \"{0}\": Value: \"{1}\"", field.Key, field.Value.ToString(Formatting.None))); 
       } 
       Console.WriteLine(""); 
      } 
     } 

原型fiddle

使用ExpandoObject

Json.NET直接支持deserializing to ExpandoObject所以你可以使用這個類爲您的項目:

public class RootObject 
{ 
    public RootObject() { this.items = new List<ExpandoObject>(); } 

    public Guid application_uid { get; set; } 
    public string formId { get; set; } 
    public int recordCount { get; set; } 
    public List<ExpandoObject> items { get; set; } 
} 

然後做:

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

     foreach (var item in root.items) 
     { 
      Console.WriteLine(string.Format("Showing custom properties for Item id {0}, uid {1}, flowState \"{2}\":", 
              item.AsDynamic().id, item.AsDynamic().uid, item.AsDynamic().flowState)); 
      { 
       foreach (var field in item.AsDictionary()) 
       { 
        if (field.Key == "id" || field.Key == "uid" || field.Key == "flowState") 
         continue;      
        Console.WriteLine(string.Format(" - Field: \"{0}\":\n Value: {1}", field.Key, JsonConvert.SerializeObject(field.Value))); 
       } 
       Console.WriteLine(""); 
      } 
     } 

用下面的擴展方法:

public static class DictionaryExtensions 
{ 
    public static IDictionary<TKey, TValue> AsDictionary<TKey, TValue>(this IDictionary<TKey, TValue> dictionary) 
    { 
     return dictionary; 
    } 
} 

public static class DynamicExtensions 
{ 
    public static dynamic AsDynamic(this IDynamicMetaObjectProvider obj) 
    { 
     return obj; 
    } 
} 

原型fiddle

這可以消除模型對Json.NET的直接依賴。然而,與第一個解決方案,ExpandoObject密封所以不能被繼承來添加標準的三個屬性。

+0

感謝您的例子中,DBC 。 – StealthRT