2015-10-14 123 views
1

我有JSON,看起來像這樣:JSON.net解析

{ 
    "status": { 
     "code": 0, 
     "message": "OK" 
    }, 
    "data": { 
     "_idtype": "cusip", 
     "_id": "00768Y883", 
     "api": { 
      "_name": "PortfolioBreakdownsRaw", 
      "PortfolioDate": "2015-10-12", 
      "GlobalBondSuperSectorLongSalePositionBreakdown": [ 
       { 
        "Name": "Municipal", 
        "Value": "0.57842" 
       }, 
       { 
        "Name": "Corporate", 
        "Value": "1.79649" 
       }, 
       { 
        "Name": "Securitized", 
        "Value": "5.29493" 
       }, 
       { 
        "Name": "Cash & Equivalents", 
        "Value": "166.20776" 
       } 
      ], 
      "GlobalBondSuperSectorShortSalePositionBreakdown": [ 
       { 
        "Name": "Government", 
        "Value": "0.90557" 
       } 
      ] 
     } 
    } 
} 

我能夠很容易地獲得響應的api部分:

var jObject = JObject.Parse(json); 
var api = jObject["data"]["api"]; 

從這裏,我不如果有任何數組將被包含在響應中。最終目標是創建一個解析器,該解析器能夠事先獲得數組名稱(GlobalBondSuperSectorShortSalePositionBreakdown)以及它可能包含的許多行鍵值對,而無需事先知道諸如(GlobalBondSuperSectorShortSalePositionBreakdown)之類的名稱。

我似乎無法找到一個很好的方式來遍歷對象,確定有api級別的數組,然後遍歷這些來獲取值。

任何幫助,將不勝感激。

+0

你想建立一個字典列表哪些是下'api'數組中元素的元素,對嗎?排除不是數組的所有元素,比如'_name'和'PortfolioDate',並且假設所有這些數組都是鍵/值對,並且不會有不符合該條件的數組,那麼它是正確的嗎? –

回答

0

下面是一個例子。在此代碼中,api變量擁有JObject,因此我們可以遍歷其屬性。從那裏,我們看看每個屬性值的Type,看看它是否是一個數組。如果是,那麼我們可以迭代該數組以獲取其中的JObjects,並提取我們期望在其中找到的NameValue值。這有幫助嗎?

var jObject = JObject.Parse(json); 
var api = jObject["data"]["api"]; 

foreach (JProperty prop in api.Children<JProperty>()) 
{ 
    JToken value = prop.Value; 
    if (value.Type == JTokenType.Array) 
    { 
     Console.WriteLine(prop.Name + ": "); 
     foreach (JObject jo in value.Children<JObject>()) 
     { 
      Console.WriteLine(" " + jo["Name"] + ": " + jo["Value"]); 
     } 
    } 
    else 
    { 
     Console.WriteLine(prop.Name + ": " + value); 
    } 
} 

輸出:

_name: PortfolioBreakdownsRaw 
PortfolioDate: 2015-10-12 
GlobalBondSuperSectorLongSalePositionBreakdown: 
    Municipal: 0.57842 
    Corporate: 1.79649 
    Securitized: 5.29493 
    Cash & Equivalents: 166.20776 
GlobalBondSuperSectorShortSalePositionBreakdown: 
    Government: 0.90557 

小提琴:https://dotnetfiddle.net/XyoXQy

+0

這很好,非常感謝。我的答案中有一些零碎點,但我無法把它們放在一起。謝謝! – kwcolson98

+0

沒問題;樂意效勞。 –

0

使用LINQ可以起到相當不錯的使用Json.net:

這裏是一個代碼塊的易於閱讀的版本這將在api元素下的JArray屬性中創建兩個字典:

var api = jObject["data"]["api"]; 
var arrays = api.Cast<JProperty>().Where(o => o.Value.Type == JTokenType.Array).Select(token => token.Value).ToArray(); 

var dictionaries = new List<Dictionary<string, string>>(); 
foreach (var array in arrays) 
{ 
    var dictionary = array.ToDictionary(token => token["Name"].Value<string>(), token => token["Value"].Value<string>()); 
    dictionaries.Add(dictionary); 
} 

替代:

同樣的事情,但更短,更緊湊的版本:

var api = jObject["data"]["api"]; 

var dictionaries = api 
    .Cast<JProperty>() 
    .Where(o => o.Value.Type == JTokenType.Array) 
    .Select(token => token.Value) 
    .Select(array => array.ToDictionary(token => token["Name"].Value<string>(), token => token["Value"].Value<string>()));