2015-11-04 98 views
0

在C#中,我做了一個GET請求以獲取som JSON數據。在這個JSON數據中有一個數組,我想要返回這些數據中的元素。我正在使用Json.NET來嘗試實現這一點。如何在JSON中獲取數組並通過循環獲取其元素

這是我的C#代碼來獲取JSON文件中的屬性。

public static string sendRequest(string url, string method) 
{ 
    try 
    { 
     // Set reqiued information for api 
     var httpWebRequest = (HttpWebRequest)WebRequest.Create(main_url + url); 
     httpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
     httpWebRequest.Headers.Add("Authorization", "Bearer " + Current_Access_Token); 
     httpWebRequest.Accept = "application/json;v=1"; 
     httpWebRequest.Method = method; 

     // Get adn return responses 
     var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
     string respStr = new StreamReader(httpResponse.GetResponseStream()).ReadToEnd(); 
     return respStr; 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show("No response"); 
    } 
    return ""; 
} 
public static string GetUserName() 
{ 
    string resp = sendRequest("api.php/currentCustomer/", "GET"); 
    JObject jObject = JObject.Parse(resp); 
    JToken Juser = jObject["response"]; 
    string UserName = (string)Juser["data"]["customer"]["name"]; 
    return UserName; 
} 

上面的代碼是我如何返回客戶名下的客戶。但是在客戶之下有一個數組,「active_digital_subscriptions」。在這個數組中有2個我想訪問的元素並保存在setting.setting中。 「active_digital_subscriptions」只包含字符串。

JSON數據:

{ 
    "response":{ 
     "code":200, 
     "status":"success", 
     "data":{ 
     "customer":{ 
      "id":"109701", 
      "email":"[email protected]", 
      "name":"ahjune152", 
      "first_name":"Loc", 
      "last_name":"Dai Le", 
      "registration_date":"2015-06-17", 
      "last_login_date":"2015-11-05", 
      "is_newsletter_subscriber":"1", 
      "digital_password":"YOtI1cuzL18dO3i9T9CBVCiX3lQa3iIPhcWDgiwHxxI=", 
      "language":{ 
       "id":"1", 
       "name":"American english", 
       "code":"en" 
      }, 
      "currency":{ 
       "id":"1", 
       "name":"Danske kroner", 
       "sign":"DKK", 
       "code":"DKK", 
       "number":"208" 
      }, 
      "preferred_platforms":[ 

      ], 
      "active_digital_subscriptions":[ 
       { 
        "plan_id":"246", 
        "plan_title":"VIP Partner" 
       } 
      ] 
     } 
     } 
    } 
} 
+1

你需要創建'JProperty'和'JArray' – MethodMan

+1

這是什麼樣的「異常處理」? –

回答

3

您可以使用SelectTokenSelectTokens用於這一目的。兩者都支持JSONPath query syntax

var userName = (string)Juser.SelectToken("data.customer.name"); 
var customersItems = Juser.SelectTokens("data.customer.customers_items[*]") 
    .Select(t => (string)t) 
    .ToArray(); 

[*]wildcard選擇所述陣列中的所有元件。

更新

鑑於修改後的JSON,就可以得到有效的用戶和活動訂閱像這樣:

var userName = (string)Juser.SelectToken("data.customer.name"); 
var activeSubscriptions = Juser.SelectTokens("data.customer.active_digital_subscriptions[*]") 
    .Select(t => new { PlanId = (string)t["plan_id"], PlanTitle = (string)t["plan_title"] }) 
    .ToArray(); 

注意的是,現有的訂閱在一個數組,所以它會出現可能可能有不止一個。如果你知道只有一個,你可以做

var activeSubscription = activeSubscriptions.SingleOrDefault(); 

在這裏,我返回訂閱在anonymous type,但如果你願意,你可以定義一個明確的類:

public class Subscription 
{ 
    public string PlanId { get; set; } 
    public string PlanTitle { get; set; } 
} 

然後執行:

var activeSubscriptions = Juser.SelectTokens("data.customer.active_digital_subscriptions[*]") 
    .Select(t => new Subscription { PlanId = (string)t["plan_id"], PlanTitle = (string)t["plan_title"] }) 
    .ToArray(); 
+0

Hi @ dbc。我試過這個,但它不起作用。我檢查了「customersItem」數組是否爲空,它是。看到我的問題編輯我已經上傳了JSON文件,而不是「customers_item」它是「active_digital_subscriptions」。但如果我控制檯輸出這一行:string resp = sendRequest(「api.php/currentCustomer /」,「GET」);控制檯不顯示整個輸出。它缺少數組:「active_digital_subscriptions」 –

+1

@LocDaiLe - 我回答了您原來的問題。但是,如果你有不同的JSON描述,'SelectTokens'仍然有用,但你需要一個不同的查詢字符串。至於你修改的問題,你添加的JSON實際上並不是JSON。我不確定它是什麼。你可以只包含JSON字符串嗎?您可以在https://jsonformatter.curiousconcept.com/格式化並驗證它。 – dbc

+1

我的不好 - 現在我已經上傳了JSON。謝謝@dbc –

1

你可以試試這個 -

var subs = (JArray)JObject.Parse(json)["response"]["data"]["customer"]["active_digital_subscriptions"]; 
for (var i = 0; i < subs.Count; ++i) 
{ 
    var id = ((JValue)subs[i]["plan_id"]).Value; 
    var title = ((JValue)subs[i]["plan_title"]).Value; 
} 
相關問題