Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/35: Рейтинг темы: голосов - 35, средняя оценка - 4.74
 Аватар для zaborin
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 73
.NET 4.x

Десериализация json

06.06.2017, 21:13. Показов 7034. Ответов 24
Метки json (Все метки)

Author24 — интернет-сервис помощи студентам
Мне нужно занести в DataGrid ответ Json, выглядет так:
JSON Скопировано
1
{"limit":[{"type":"ask","call":1060282,"amount":100,"tid":100060352,"timestamp":1496772176},{"type":"ask","call":1066782,"amount":56,"tid":100060337,"timestamp":1496772172},{"type":"ask","call":85286,"amount":78,"tid":100059826,"timestamp":1496772097}
Ни как не соображу как сделать
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.06.2017, 21:13
Ответы с готовыми решениями:

Десериализация строки php
Доброго времени суток. Наткнулся вот на какой вопрос. Есть ли в vb.net функция, аналогичная unserialize() в php? Задача такая. Есть...

Селективная (частичная) десериализация объектов
Доброго времени суток, коллеги! Появилась острая необходимость решения следующей задачи: Есть некий объект (пусть будет класс А),...

Невозможная десериализация другим приложением
Добрый вечер! Как то я начал сохранять структуры в файл с помощью сериализации и все было хорошо пока я не захотел считывать данные с...

24
 Аватар для edward_freedom
1569 / 1448 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
06.06.2017, 23:10
zaborin, http://www.newtonsoft.com/json
2
 Аватар для ViterAlex
8945 / 4857 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
07.06.2017, 14:31
Лучший ответ Сообщение было отмечено zaborin как решение

Решение

тебе нужны два класса, в которые нужно десериализовать строку json:
VB.NET Скопировано
1
2
3
4
5
6
7
8
9
10
11
Public Class Limit
    Public Property type() As String
    Public Property [call]() As Integer
    Public Property amount() As Integer
    Public Property tid() As Integer
    Public Property timestamp() As Integer
End Class
 
Public Class RootObject
    Public Property limit() As List(Of Limit)
End Class
Затем всё просто:
VB.NET Скопировано
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
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    DataGridView1.AutoGenerateColumns = True
    Dim json As String = "{""limit"":" +
                        "   [" +
                        "       {" +
                        "           ""type"":""ask""," +
                        "           ""call"":1060282," +
                        "           ""amount"":100," +
                        "           ""tid"":100060352," +
                        "           ""timestamp"":1496772176" +
                        "       }," +
                        "       {" +
                        "           ""type"":""ask""," +
                        "           ""call"":1066782," +
                        "           ""amount"":56," +
                        "           ""tid"":100060337," +
                        "           ""timestamp"":1496772172" +
                        "       }," +
                        "       {" +
                        "           ""type"":""ask""," +
                        "           ""call"":85286," +
                        "           ""amount"":78," +
                        "           ""tid"":100059826," +
                        "           ""timestamp"":1496772097" +
                        "       }" +
                        "   ]" +
                        "}"
    Dim jsonobj = JsonConvert.DeserializeObject(Of RootObject)(json)
    DataGridView1.DataSource = jsonobj.limit
End Sub
3
 Аватар для zaborin
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 73
07.06.2017, 20:57  [ТС]
ViterAlex, огромное спасибо всё как я и хотел, в принципе по наводке edward_freedom почти до этого дошёл, но не совсем, а здесь твой пример самое то.
0
 Аватар для zaborin
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 73
10.06.2017, 06:46  [ТС]
Ещё такой вопрос, при ответе с сервера "limit" меняется и может к примеру быть "status" и ещё как угодно, как это реализовать в коде?
0
 Аватар для ViterAlex
8945 / 4857 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
10.06.2017, 08:19
zaborin, подробнее поясни, что и где меняется
0
 Аватар для zaborin
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 73
10.06.2017, 14:00  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
zaborin, подробнее поясни, что и где меняется
При ответе от сервера может меняться вот это
"{""limit"":" +
0
 Аватар для ViterAlex
8945 / 4857 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
10.06.2017, 14:06
zaborin, если у сервера есть описание ответов, нужно читать его и под него разрабатывать классы. Если нет, то самому попробовать получить все возможные варианты структуры ответа и опять же разработать общие классы. Так что выкладывай какие ещё ответы могут быть. Только следи за парностью скобок.
0
 Аватар для zaborin
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 73
10.06.2017, 14:30  [ТС]
Больше ничего нет, а без создания классов не получиться?
0
 Аватар для ViterAlex
8945 / 4857 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
10.06.2017, 14:41
zaborin, терпенье и труд всё перетрут!
Цитата Сообщение от zaborin Посмотреть сообщение
Больше ничего нет
Тогда откуда ты знаешь, что структура ответа может быть другой?
0
 Аватар для zaborin
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 73
10.06.2017, 15:39  [ТС]
Вижу как приходит ответ, в описании ничего нет
Может вот так прийти
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
"{""limit"":" +
                        "   [" +
                        "       {" +
                        "           ""type"":""ask""," +
                        "           ""call"":1060282," +
                        "           ""amount"":100," +
                        "           ""tid"":100060352," +
                        "           ""timestamp"":1496772176" +
                        "       }," +
                        "       {" +
                        "           ""type"":""ask""," +
                        "           ""call"":1066782," +
                        "           ""amount"":56," +
                        "           ""tid"":100060337," +
                        "           ""timestamp"":1496772172" +
                        "       }," +
                        "       {" +
                        "           ""type"":""ask""," +
                        "           ""call"":85286," +
                        "           ""amount"":78," +
                        "           ""tid"":100059826," +
                        "           ""timestamp"":1496772097" +
                        "       }" +
                        "   ]" +
                        "}"
А может вот так:
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
"{""status"":" +
                        "   [" +
                        "       {" +
                        "           ""type"":""ask""," +
                        "           ""call"":1060282," +
                        "           ""amount"":100," +
                        "           ""tid"":100060352," +
                        "           ""timestamp"":1496772176" +
                        "       }," +
                        "       {" +
                        "           ""type"":""ask""," +
                        "           ""call"":1066782," +
                        "           ""amount"":56," +
                        "           ""tid"":100060337," +
                        "           ""timestamp"":1496772172" +
                        "       }," +
                        "       {" +
                        "           ""type"":""ask""," +
                        "           ""call"":85286," +
                        "           ""amount"":78," +
                        "           ""tid"":100059826," +
                        "           ""timestamp"":1496772097" +
                        "       }" +
                        "   ]" +
                        "}"
0
 Аватар для ViterAlex
8945 / 4857 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
10.06.2017, 17:51
Лучший ответ Сообщение было отмечено zaborin как решение

Решение

zaborin, придётся тебе окунаться в беспощадный мир нестрогого типизирования. Итак, у тебя два (или больше) объекта с одинаковыми свойствами. Объединим эти свойства в класс:
VB.NET Скопировано
1
2
3
4
5
6
7
Public Class JsonData
    Public Property type() As String
    Public Property [call]() As Integer
    Public Property amount() As Integer
    Public Property tid() As Integer
    Public Property timestamp() As Integer
End Class
Полученную json-строку нужно прочитать в JObject, у того прочитать свойство с ожидаемым именем и если результат не равен Nothing, прочитать объекты. Примерно так:
VB.NET Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Function GetJsonData(json As String) As List(Of JsonData)
    Dim jobj As JObject = JsonConvert.DeserializeObject(json)
    'Возможные названия свойств, содержащих данные
    Dim propNames = New String() {"limit", "status"}
    Dim result As List(Of JsonData)
    For Each propName As String In propNames
        'Читаем свойство
        Dim jT = jobj(propName)
 
        If jT Is Nothing Then Continue For
        result = New List(Of JsonData)
        For Each token As JToken In jT
            result.Add(token.ToObject(GetType(JsonData)))
        Next
        Exit For
    Next
    Return result
End Function
Ну а полученные список со строгими типами можно назначать источником данных в dgv
3
 Аватар для zaborin
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 73
30.06.2017, 21:23  [ТС]
А как мне вот такой ответ json разобрать:
JSON Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
    "success":1,
    "return":{
        "100025362":{
            "pair":ltc_btc,
            "type":sell,
            "start_amount":13.345,
            "amount":12.345,
            "rate":485,
            "timestamp_created":1418654530,
            "status":0
        },
            "103252534":{
            "pair":"ltc_btc",
            "type":"sell",
            "amount":21.615,
            "rate":0.258,
            "timestamp_created":1418654530,
            "status":0
    }
}
"100025362" и "103252534" это id и они изначально неизвестны, как мне их получить, покажите пример пожалуйста

Добавлено через 8 минут
Пробовал так:
VB.NET Скопировано
1
2
3
4
5
6
7
8
 Dim o As JObject = JObject.Parse(thepage)
 
            For Each tkn As JToken In o("return")
                For Each ter As IJEnumerable(Of JToken) In tkn.Values()
 
                    MsgBox(ter.ToString())
                Next
            Next
Но это совсем не то.

Добавлено через 4 часа 6 минут
Никто не в курсе?

Добавлено через 7 часов 0 минут
???

Добавлено через 15 часов 41 минуту
Никто не поможет?
0
0 / 0 / 1
Регистрация: 22.03.2016
Сообщений: 9
08.02.2018, 12:36
помогите разобрать ответ json
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
{
    "walletBalances": [
        {
            "balance": 2.04000,
            "wallet": {
                "id": "622489c8-6e08-11e7-80df-d8d38565926f",
                "name": "Бонусные баллы",
                "programType": "Bonus",
                "type": "IikoCard"
            }
        },
        {
            "balance": 200.00000,
            "wallet": {
                "id": "57f36cd6-8c27-11e7-80df-d8d38565926f",
                "name": "Бонусный баллы 100%",
                "programType": "Bonus",
                "type": "IikoCard"
            }
        },
        {
            "balance": 301.00000,
            "wallet": {
                "id": "2a8d9885-fb68-11e7-80cb-d8d385655247",
                "name": "Баллы АГЗС",
                "programType": "Bonus",
                "type": "IikoCard"
            }
не могу сделать чтобы в гриде выводил: Название кошелька и баланс?
0
Лень — мое второе и
 Аватар для Orlangur
3224 / 2413 / 686
Регистрация: 28.11.2014
Сообщений: 3,599
Записей в блоге: 3
08.02.2018, 14:10
DjSan,
VB.NET Скопировано
1
2
3
4
5
6
7
8
Dim json As String = IO.File.ReadAllText("C:\Users\administrator\Desktop\1.txt", System.Text.Encoding.Default)
 
        Dim ParseJson As JObject = JObject.Parse(json)
        For i = 0 To ParseJson("walletBalances").Count - 1
            Dim walletBalance As String = ParseJson("walletBalances")(i)("balance")
            Dim walletName As String = ParseJson("walletBalances")(i)("wallet")("name")
            ListView1.Items.Add(walletName).SubItems.Add(walletBalance)
        Next
2
0 / 0 / 1
Регистрация: 22.03.2016
Сообщений: 9
08.02.2018, 16:20
Спасибо большое!
0
0 / 0 / 0
Регистрация: 09.10.2017
Сообщений: 15
14.03.2018, 21:11
Есть JSON
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
{
  "getuserworkers": {
    "version": "1.0.0",
    "runtime": 8.6991786956787,
    "data": [
      {
        "id": 131881,
        "username": "Work1",
        "password": "123",
        "monitor": 1,
        "hashrate": 0.628,
        "difficulty": 0
      },
      {
        "id": 131855,
        "username": "Work2",
        "password": "123",
        "monitor": 1,
        "hashrate": 1.569,
        "difficulty": 0
      }
    ]
  }
}
Необходимо определить количество элементов в массиве "data".
При запуске выдаёт сообщение "Необработанное исключение типа "System.ArgumentNullException" в System.Core.dll
Значение не может быть неопределенным."

VB.NET Скопировано
1
2
3
4
Dim json_Workers as String ="{"getuserworkers":{"version":"1.0.0","runtime":10.771989822388,"data":[{"id":131881,"username":"Work1","password":"123","monitor":1,"hashrate":0.628,"difficulty":0},{"id":131855,"username":"Work2","password":"123","monitor":1,"hashrate":1.569,"difficulty":0}]}}"
 
Dim ParseJson As JObject = JObject.Parse(json_Workers)
Dim Count_Worker As Integer = ParseJson("getuserworkers.data").Count
Подскажите, что делаю не так?
0
Лень — мое второе и
 Аватар для Orlangur
3224 / 2413 / 686
Регистрация: 28.11.2014
Сообщений: 3,599
Записей в блоге: 3
15.03.2018, 02:52
Victor2000,
VB.NET Скопировано
1
 Dim Count_Worker As Integer = ParseJson("getuserworkers")("data").Count
3
0 / 0 / 0
Регистрация: 09.10.2017
Сообщений: 15
15.03.2018, 08:12
Спасибо.

Может кто-то подсказать книгу где можно JSON с VB.NET русскоязычную подучить. А то с Java у них в синтаксисах различия. Принцип понятен, но вот с написанием возникают проблемы.
0
399 / 318 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
15.03.2018, 10:23
Victor2000, на официальном сайте библиотеки содержится большое количество примеров - https://www.newtonsoft.com/jso... mples.htm#!
Единственный минус, примеры на C#. Чтобы переконвертировать код с C# -> VB.NET можно воспользоваться сервисом - http://converter.telerik.com/Default.aspx

Книжек не припоминаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.03.2018, 10:23
Помогаю со студенческими работами здесь

Пользовательская сериализация/десериализация большого объема данных
Добрейшего времени суток, коллеги! Разрабатываю узко-специализированное ПО. Для сохранения файла с данными использую пользовательскую...

Десериализация и DefaultValueAttribute
Допустим, имею класс с двумя свойствами: Как видите, у каждого из свойств установлено дефолтное значение. Поэтому, когда я...

Десериализация JSON из ВК без JSON.NET
JSON: { "response" : } Мой код: string json = тут текст из спойлера вначале; JavaScriptSerializer jser = new...

Json десериализация
помогите десириализовать json туплю не имоверно но не понимаю как это работает вот пример входной строки { ...

JSON десериализация
Как корректно десериализовать что-то вроде такого? "А": числоА, "Б": числоБ, "С": "D": ], ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Результаты исследования от команды MCM (март 2025 г.)
Programma_Boinc 07.04.2025
Результаты исследования от команды MCM (март 2025 г. ) В рамках наших текущих исследований мы продолжаем изучать гены, которые имеют наибольшую вероятность развития рака легких, выявленные в рамках. . .
Рекурсивные типы в Python
py-thonny 07.04.2025
Рекурсивные типы - это типы данных, которые определяются через самих себя или в сочетании с другими типами, которые в свою очередь ссылаются на исходный тип. В мире программирования такие структуры. . .
C++26: Объединение и конкатенация последовательностей и диапазонов в std::ranges
NullReferenced 07.04.2025
Работа с последовательностями данных – одна из фундаментальных задач, с которой сталкивается каждый разработчик. C++ прошел длинный путь в эволюции средств для манипуляции коллекциями – от. . .
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер