【问题标题】:how get all elements of array in deserialize json c#?如何在反序列化json c#中获取数组的所有元素?
【发布时间】:2014-08-24 18:14:32
【问题描述】:

在 C# 中,我有 5-6 天,我想尝试使用 api 一个站点。 我已经反序列化 JSON,这是格式

[ { “uid”:1476402, "first_name": "", "姓氏": "", “域”:“sandrische”, “在线”:1, “用户 ID”:1476402 }, { “uid”:3813182, "first_name": "", "姓氏": "", “域”:“id3813182”, “在线”:0, “用户 ID”:3813182 }, { “uid”:12789624, "first_name": "", "姓氏": "", “域”:“id12789624”, “在线”:0, “用户 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() 的问题是什么?请帮忙或举个例子。

【问题讨论】:

  • 无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“WindowsFormsApplication30.vkResponse”,因为该类型需要 JSON 对象(例如 {"name":"value"})正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合的类型
  • 如果您通过 asp.net web-api 控制器使用它,您可以简单地将其作为操作的参数,序列化程序会自动为您排序。含义 void myaction([FromBody] vkResponse[] 响应)

标签: c# json jsonserializer


【解决方案1】:
var v = JsonConvert.DeserializeObject<IEnumerable<vkResponse>>(array.ToString());

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

【讨论】:

  • 错误 1 ​​无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“WindowsFormsApplication30.vkResponse”。存在显式转换(您是否缺少演员表?) C:\Users\Pc\documents\visual studio 2012\Projects\WindowsFormsApplication30\WindowsFormsApplication30\Form1.cs 31 28 WindowsFormsApplication30
  • 谢谢。但是如何访问 ID 属性呢?
  • 如果我使用var userid = v.First().Id; 仍然获得第一个 ID,但我想获得所有 ID
  • 是的,您现在可以查看吗?
  • var v = JsonConvert.DeserializeObject&lt;IEnumerable&lt;vkResponse&gt;&gt;(array.ToString()); var userids = v.Select(x =&gt; x.Id); richTextBox1.Text = userids.ToString(); 转为System.Linq.Enumerable+WhereSelectListIterator2[WindowsFormsApplication30.vkResponse,System.Int32]
【解决方案2】:

您的响应是vkResponse 类的数组,因此您可以将其反序列化为c# array

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 字符串缺少右括号 ("]")。

【讨论】:

  • 请给我举例说明如何循环访问每个元素的 ID,我是愚蠢的 rus 人((99
  • 非常感谢 :) 这一切是如何导致文本框的?)
  • 如果使用richTextBox1.Text = vkResponses[i].Id.ToString();,输出一个Id ((
  • @voodooSHA A - 当返回多个对象时,您希望在文本框中向用户显示什么?每个 Id 在单独的行上?每个 Id 用逗号分隔?还是什么?
  • 没关系,用逗号隔开或者换行,我想开始只是polucht所有Id,而不是一个。
猜你喜欢
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2020-11-06
相关资源
最近更新 更多