2015-11-04 133 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; 
} 
相关问题