Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 09.04.2013
Сообщений: 28
1
.NET 4.x

[Json] Получение значений атрибутов

15.07.2015, 20:32. Показов 6234. Ответов 12

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Как можно вытащить значение атрибутов в данной файле? Конкретно нужно узнать значение username, state, name, age, fade, id.

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "meta":  {
    "code": 350
  },
  "data":  {
    "username": "MyUserName",
    "state": "Russia",
    "name": "MyName",
    "counts":  {
      "age": 17,
      "fade": 1,
    },
    "id": "myId"
  }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2015, 20:32
Ответы с готовыми решениями:

Получение атрибутов
Добрый вечер. Каким образом извлекать атрибуты, присоединенные к полям и методам. Для получения...

JSON сериализация: VS не знает таких атрибутов, как DataContract и DataMember
Доброго времени суток! Впервые в жизни понадобилась сериализация. Почитал разные статейки,...

Получение атрибутов с аудио файла
Здравствуйте! Подскажите, пожалуйста, как получить картинку с песни. Я использую пространство...

Вывод значений из одинаковых тегов XML без атрибутов
Как при проходе по XML файлу выводить данные одинаковых тегов в одном узле, которые не имеют...

12
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
15.07.2015, 21:34 2
Aqeee, подключи библиотеку Json.Net и парси:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string json = @"{
  ""meta"":  {
    ""code"": 350
  },
  ""data"":  {
    ""username"": ""MyUserName"",
    ""state"": ""Russia"",
    ""name"": ""MyName"",
    ""counts"":  {
      ""age"": 17,
      ""fade"": 1,
    },
    ""id"": ""myId""
  }
}";
JObject j = JObject.Parse(json);
string username = (string)j["data"]["username"];
int age = (int)j["data"]["counts"]["age"];
Это не единственный способ работы с Json через Json.Net. Только самый простой. Смотри другие примеры на официальном сайте.
1
0 / 0 / 0
Регистрация: 09.04.2013
Сообщений: 28
16.07.2015, 14:06  [ТС] 3
OwenGlendower,
Извиняюсь за глупый вопрос, но я встал в ступор. Что я делаю не так? Подключил библиотеку Json
Делаю запрос, пытаюсь парсить и получаю ошибку:

Необработанное исключение типа "System.ArgumentException" в Newtonsoft.Json.dll
Дополнительные сведения: Accessed JArray values with invalid key value: "username". Array position index expected.

C#
1
2
3
4
5
6
7
//Запрос
string resp = GET_http(url);
JObject j = JObject.Parse(resp);
string username = (string)j["data"]["username"];
string id = (string)j["data"]["id"];
int followed_by = (int)j["data"]["counts"]["age"];
//....
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
16.07.2015, 14:08 4
Aqeee, скорее всего структура JSON отличается от приведенной в первом сообщении.
0
0 / 0 / 0
Регистрация: 09.04.2013
Сообщений: 28
16.07.2015, 14:30  [ТС] 5
OwenGlendower,
Отловил значение resp и принимает оно вот такую кашу, да и то не полную:
Javascript
1
"{\"meta\":{\"code\":350},\"data\":[{\"username\":\"MyUserName\",\"state\":\"Russia",\"id\":\"myId\"}]}"
В чем может быть причина?
Запрос делал правильный, вставляя тот же запрос в строку браузера выдает всё что нужно, только в корявом формате


Для пояснения GET_http(url);
C#
1
2
3
4
5
6
7
8
9
10
public string GET_http(string url)
        {
            System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            System.Net.WebRequest reqGET = System.Net.WebRequest.Create(url);
            System.Net.WebResponse resp = reqGET.GetResponse();
            System.IO.Stream stream = resp.GetResponseStream();
            System.IO.StreamReader sr = new System.IO.StreamReader(stream);
            string html = sr.ReadToEnd();
            return html;
        }
0
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
16.07.2015, 14:37 6
JSON
1
2
3
4
5
6
7
8
9
10
11
12
{
     "meta":{
                    "code":350
                },
     "data":[
                 {
                     "username":"MyUserName",
                     "state":"Russia",
                     "id":"myId"
                 }
               ]
}
Ну так data это массив!
Соответственно нужно и получать данные из массива:

C#
1
2
JObject j = JObject.Parse(json);
string username = (string)j["data"][0]["username"];
1
0 / 0 / 0
Регистрация: 09.04.2013
Сообщений: 28
16.07.2015, 14:54  [ТС] 7
LeniumSoft, а что на счет не полученных данных counts?
0
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
16.07.2015, 14:59 8
Цитата Сообщение от Aqeee Посмотреть сообщение
а что на счет не полученных данных counts
В смысле? Я их в вашем последнем json не наблюдаю!
Вам нужно выяснить причину их отсутствия!
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
16.07.2015, 15:31 9
Цитата Сообщение от Aqeee Посмотреть сообщение
Запрос делал правильный, вставляя тот же запрос в строку браузера выдает всё что нужно, только в корявом формате
То что ты обращаешься к тому же адресу не означает что ты делаешь идентичный запрос (с точки зрения сервера). Например, ты не указываешь заголовок User-Agent. Некоторые сайты в таком случае отвечают по другому. Поэтому добавь хотя бы его. Если не поможет, то посмотри с помощью Fiddler что отправляет браузер и добейся аналогичного запроса через код.
0
0 / 0 / 0
Регистрация: 09.04.2013
Сообщений: 28
21.07.2015, 13:00  [ТС] 10
Нашел проблему в запросе и получилось сделать одиночный парс данных. Теперь возник другой вопрос, как спарсить множество данных из большого запроса. Например есть запрос с N количеством элементов в "data", нужно из каждого получить "username" и "age"

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
  "meta":  {
    "code": 350
  },
  "data":  [
{
    "username": "MyUserName",
    "state": "Russia",
    "name": "MyName",
    "counts":  {
      "age": "17",
      "fade": "1"
    },
    "id": "myId"
  },
{
    "username": "MyUserName",
    "state": "Russia",
    "name": "MyName",
    "counts":  {
      "age": "21",
      "fade": "13"
    },
    "id": "myId"
  }
]
}
Смотрел примеры в doc json, но все попытки увенчались ошибками
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
21.07.2015, 13:31 11
Aqeee, элементарно Ватсон:
C#
1
2
3
4
5
JObject j = JObject.Parse(json);
foreach (var dataItem in j["data"].Children())
{
    string username = (string)dataItem["username"];
}
Или
C#
1
2
3
4
5
6
JObject j = JObject.Parse(json);
JArray data = (JArray)j["data"];
for (int i=0; i<data.Count; i++)
{
    string username = (string)j["data"][i]["username"];
}
1
0 / 0 / 0
Регистрация: 09.04.2013
Сообщений: 28
21.07.2015, 14:30  [ТС] 12
OwenGlendower, спасибо, получилось. Но, есть один нюанс который я не учел.
На странице отображается только 20 элементов, что бы появились следующие 20, нужно делать новый запрос который есть выше в другом блоке.

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"settings":  {
    "next_url": "Запрос на следующие 20 элементов"
  },
  "meta":  {
    "code": 350
  },
  "data":  [
{
    "username": "MyUserName",
    "state": "Russia",
    "name": "MyName",
    "counts":  {
      "age": "17",
      "fade": "1"
    },
    "id": "myId"
  },
{
    "username": "MyUserName",
    "state": "Russia",
    "name": "MyName",
    "counts":  {
      "age": "21",
      "fade": "13"
    },
    "id": "myId"
  }
]
}
В общем, как можно получить полный список всех элементов с последующими запросами?
P.S Извиняюсь, если уже надоел вам

Добавлено через 7 минут
Код в потоке
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
string json2 = GET_http("Запрос");
            JObject j2 = JObject.Parse(json2);
 
            try
            {
                foreach (var dataItem in j2["data"].Children())
                {
                    string username = (string)dataItem["counts"]["username"];
                    int user_id = (int)dataItem["counts"]["id"];
                    this.Invoke((MethodInvoker)delegate()
                    {
 
                        richTextBox1.AppendText("username: " + username + " id: " + user_id + "\n");
 
 
                    });
                }
 
            }
            catch
            {
 
                MessageBox.Show("Error!");
 
            }
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
21.07.2015, 15:57 13
Aqeee, раз данные поступают частями, то для получения всех данных есть только один способ - цикл. В данном случае пока есть settings.next_url.
0
21.07.2015, 15:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2015, 15:57
Помогаю со студенческими работами здесь

Получение значения из Json
Добрый день, прошу вашей помощи... var result = api.ApiQuery(&quot;user_info&quot;, new Dictionary&lt;string,...

Чтение JSON: получение названий
Привет! У меня есть файл CM.json Его содержимое (Я скопировал нужную часть кода): &quot;libraries&quot;:...

Поиск по Json и получение нужного ID
Доброго времени суток. Получаю Json: {&quot;meta&quot;:{&quot;code&quot;:200},&quot;data&quot;: } Сериализую его: public...

Получение значения JSON по заданному пути
Здравствуйте, товарищи форумчане. Я в C# и JSON не спец, поэтому прошу помочь. Нужно написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru