簡體   English   中英

如何在反序列化json c#中獲取數組的所有元素?

[英]how get all elements of array in deserialize json c#?

在C#中,我有5到6天的時間,我想嘗試在一個站點上使用api。 我已經反序列化JSON,這是格式

[{“ uid”:1476402,“ first_name”:“ ”,“ last_name”:“ ”,“ domain”:“ sandrische”,“ online”:1,“ user_id”:1476402},{“ uid”:3813182, “ first_name”:“ ”,“ last_name”:“ ”,“ domain”:“ id3813182”,“ online”:0,“ user_id”:3813182},{“ uid”:12789624,“ first_name”:“ ”,“ last_name“:” “,” domain“:” id12789624“,” online“:0,” user_id“:12789624}]

有一個課

 public class vkResponse
{
    [JsonProperty(PropertyName = "uid")]
    public int Id { get; set; }

    [JsonProperty(PropertyName = "first_name")]
    public string FirstName { get; set; }

    [JsonProperty(PropertyName = "last_name")]
    public string LastName { get; set; }

    [JsonProperty(PropertyName = "photo_50")]
    public Uri PhotoUri { get; set; }

    [JsonProperty(PropertyName = "online")]
    [JsonConverter(typeof(BoolConverter))]
    public bool IsOnline { get; set; }

    [JsonProperty(PropertyName = "lists")]
    public List<int> Lists { get; set; }

}


public class BoolConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((bool)value) ? 1 : 0);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return reader.Value.ToString() == "1";
    }
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(bool);
    }
}

我想獲得身份證

 var req = new HttpRequest();
        string resp = req.Get("https://api.vk.com/method/friends.get?user_ids=1&fields=domain&access_token=" + GetToken()).ToString();
       JObject o = JObject.Parse(resp);
        JArray array = (JArray)o["response"];
        vkResponse v = JsonConvert.DeserializeObject<vkResponse>(array.First().ToString());

        richTextBox1.Text = v.Id.ToString();

但是我只獲得第一個ID,如何獲得所有ID? 我認為這個array.First().ToString() 請幫忙或舉一個例子。

var v = JsonConvert.DeserializeObject<IEnumerable<vkResponse>>(array.ToString());

var userids = v.Select(x=>x.id);

您的響應是vkResponse類的數組,因此您可以將其反序列化為c#數組

vkResponse[] vkResponses = JsonConvert.DeserializeObject<vkResponse[]>(array.ToString());

一旦有了數組,您就可以循環訪問每個元素的ID。

請給我一個示例,說明如何循環訪問每個元素的ID

好的,這是使用基本c#循環構造和數組來實現的一種方法:

    vkResponse[] vkResponses = JsonConvert.DeserializeObject<vkResponse[]>(array.ToString());
    if (vkResponses == null)
        throw new JsonException();
    int [] ids = new int[vkResponses.Length];

    for (int i = 0; i < vkResponses.Length; i++)
    {
        ids[i] = vkResponses[i].Id;
    }

如果要在富文本框中將ID顯示為以逗號分隔的整數序列,請使用以下方法生成字符串:

    public static string ExtractVkResponseIds(string vkResponseJson)
    {
        vkResponse[] vkResponses = JsonConvert.DeserializeObject<vkResponse[]>(vkResponseJson);
        if (vkResponses == null)
            throw new JsonException();
        StringBuilder sb = new StringBuilder();
        // Format the ids as a comma separated string.
        foreach (var response in vkResponses)
        {
            if (sb.Length > 0)
                sb.Append(System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator);
            sb.Append(response.Id.ToString());
        }
        return sb.ToString();
    }

並這樣稱呼:

    var req = new HttpRequest();
    string resp = req.Get("https://api.vk.com/method/friends.get?user_ids=1&fields=domain&access_token=" + GetToken()).ToString();
    JObject o = JObject.Parse(resp);
    JArray array = (JArray)o["response"];
    string ids = ExtractVkResponseIds(array.ToString());
    richTextBox1.Text = ids;

順便說一下,我使用了本地化的ListSeparator ,這在您的語言中可能不是逗號。 您可以根據需要將其更改為文字逗號。

順便說一下,您的示例Json字符串缺少右括號(“]”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM