как получить все элементы массива в десериализации json С#?

На C# у меня дней 5-6 и захотелось попробовать использовать апи один сайт. Я десериализовал JSON, и вот формат

[ { "uid": 1476402, "first_name": "", "last_name": "", "domain": "sandrische", "online": 1, "user_id": 1476402 }, { "uid": 3813182, "first_name": "", "last_name": "", "domain": "id3813182", "онлайн": 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();

Но я получаю только первый идентификатор, как получить все идентификаторы? Я думаю что проблема в этом array.First().ToString() ? Пожалуйста, помогите или приведите пример.


person voodooSHA A    schedule 24.08.2014    source источник
comment
Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип «WindowsFormsApplication30.vkResponse», поскольку для правильной десериализации этого типа требуется объект JSON (например, {имя:значение}). Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {name:value}), либо измените десериализованный тип на массив или тип, реализующий коллекцию.   -  person voodooSHA A    schedule 24.08.2014
comment
Если вы используете это через контроллер веб-API asp.net, вы можете просто принять это как аргумент действия, и сериализатор автоматически отсортирует его для вас. Значение void myaction([FromBody] vkResponse[] ответы)   -  person Gaute Løken    schedule 24.08.2014


Ответы (2)


Ваш ответ представляет собой массив из vkResponse классов, поэтому вы можете десериализовать его как массив c#< /а>:

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

Когда у вас есть массив, вы можете просмотреть и получить доступ к идентификаторам каждого элемента.

Пожалуйста, дайте мне пример, как выполнить цикл и получить доступ к идентификаторам каждого элемента.

Хорошо, вот способ сделать это, используя элементарные циклические конструкции и массивы С#:

    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;
    }

Если вы хотите отобразить идентификаторы в виде последовательности целых чисел, разделенных запятыми, в поле форматированного текста, используйте следующий метод для создания строки:

    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 отсутствует закрывающая скобка ("]").

person dbc    schedule 24.08.2014
comment
Пожалуйста, дайте мне пример, как пройти и получить доступ к идентификаторам каждого элемента, я тупой русский парень ((99 - person voodooSHA A; 24.08.2014
comment
Спасибо большое :) И как это все привести к текстовому полю?) - person voodooSHA A; 24.08.2014
comment
при использовании richTextBox1.Text = vkResponses[i].Id.ToString(); выводится один идентификатор (( - person voodooSHA A; 24.08.2014
comment
@voodooSHA A - что вы хотите показать пользователю в текстовом поле, когда возвращается несколько объектов? Каждый идентификатор в отдельной строке? Каждый идентификатор разделен запятой? Или что? - person dbc; 24.08.2014
comment
Неважно, через запятую или с новой строки, я хочу для начала просто получть все Ids, а не один. - person voodooSHA A; 24.08.2014
comment
@voodooSHA A - Хорошо, попробуй. - person dbc; 25.08.2014

person    schedule
comment
Ошибка 1. Не удается неявно преобразовать тип «System.Collections.Generic.IEnumerable‹WindowsFormsApplication30.vkResponse›» в «WindowsFormsApplication30.vkResponse». Существует явное преобразование (вам не хватает приведения?) C:\Users\Pc\documents\visual studio 2012\Projects\WindowsFormsApplication30\WindowsFormsApplication30\Form1.cs 31 28 WindowsFormsApplication30 - person voodooSHA A; 24.08.2014
comment
Спасибо. Но как получить доступ к свойству ID? - person voodooSHA A; 24.08.2014
comment
Если я использую var userid = v.First().Id;, я все равно получу первый идентификатор, но я хочу получить все идентификаторы - person voodooSHA A; 24.08.2014
comment
Да, вы можете проверить сейчас? - person Giannis Paraskevopoulos; 24.08.2014
comment
var v = JsonConvert.DeserializeObject<IEnumerable<vkResponse>>(array.ToString()); var userids = v.Select(x => x.Id); richTextBox1.Text = userids.ToString(); исполнилось System.Linq.Enumerable+WhereSelectListIterator2[WindowsFormsApplication30.vkResponse,System.Int32] - person voodooSHA A; 24.08.2014