0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 23
1

Парсинг JSON в Delphi

19.11.2016, 16:35. Показов 5531. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Знаю что это тема освещалась уже несколько раз, но все что мог найти, это библиотеки для парсинга JSON с простейшими примерами.
Пробовал использовать библиотеку JsonDataObjects, но не понял как применять её в сложных конструкциях.
Например:
JSON
1
{"response":{"count":2,"items":[{"message":{"id":11111,"date":1479529902,"title":"TempTitle","body":"TempBody"}}]}}
Как вытащить значение title и body?

Что я пробовал делать:
Delphi
1
2
3
4
5
6
7
8
9
var
    Obj: TJsonObject;
begin
    Obj := TJsonObject.ParseFromFile('json.txt') as TJsonObject;
    try
         ShowMessage(Obj['title'].Value);
    finally
        Obj.Free;
    end;
Но это не работает, может нужно сначала обращаться к массиву items?

Если есть какие-либо другие варианты, можете написать, буду рад любой помощи

Добавлено через 37 минут
Еще пробовал через x-superobject
Вроде полегче, но тоже где-то ошибка.
Delphi
1
2
X := SO(s); //s - JSON строка
  ShowMessage( X['response."items[Index]"."message"."title"'].AsString );
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2016, 16:35
Ответы с готовыми решениями:

Delphi - Парсинг JSON
Добрый день. Не получается распарсить. вылетает на строчке JSONArray :=...

Парсинг Json
Здравствуйте, нужна помощь. Как получить значения ask. ...

Парсинг JSON
Данный код выдает ошибку "access violation at address 008d4b2c" var s : string; Json:...

Парсинг Json
В общем мне нужно получить из json "body": {"response": {"history":...

4
5393 / 4321 / 1060
Регистрация: 29.08.2013
Сообщений: 27,128
Записей в блоге: 3
19.11.2016, 22:08 2
если у вас там всего 1 строка можеть быть просто через POS() найти и вырезать?
0
5777 / 4520 / 1430
Регистрация: 14.04.2014
Сообщений: 20,143
Записей в блоге: 20
19.11.2016, 23:33 3
Лучший ответ Сообщение было отмечено Encamy как решение

Решение

index:=??? 0 ?

Delphi
1
2
X:=SO(s);
showMessage(X.O['response'].a['items'].o[index].o['message'].s['title']);
1
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 23
20.11.2016, 07:47  [ТС] 4
Цитата Сообщение от qwertehok Посмотреть сообщение
если у вас там всего 1 строка можеть быть просто через POS() найти и вырезать?
Строчка не одна, я думал делать через поиск подстроки, но её может не быть, либо в строке будут несколько значений, кроме тех двух. Через поиск реализовывать намного сложнее.

Добавлено через 28 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
index:=??? 0 ?
X:=SO(s);
showMessage(X.O['response'].a['items'].o[index].o['message'].s['title']);
Спасибо! Как я и сам не додумался? Теперь мне стыдно)
0
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
20.11.2016, 16:29 5
Вот ещё вариант через библиотеку System.JSON

Delphi
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
31
32
33
34
35
procedure TfParseComplicatedJSON.bParse2Click(Sender: TObject);
 
var
   OriginalJSONObject, ResponseJO, FirstElementInArray: TJSONObject;
   joItems: TJSONArray;
   OriginJsonString: String;
 
  titleJO: TJsonObject;
  MessageJO: TJsonObject;
 
 
begin
  OriginJsonString := MemoSource2.Lines.Text; // original JSON without added braces around it
  OriginalJSONObject := TJSONObject.ParseJSONValue(OriginJsonString) as TJSONObject;
 
  ResponseJO:=(OriginalJSONObject.GetValue('response') as TJSONObject);
 
 
    joItems := ResponseJO.GetValue('items') as TJSONArray;
 
    FirstElementInArray := joItems.Items[0] as TJSONObject;
 
    MessageJO:=FirstElementInArray.GetValue('message') as TJSONObject;
 
 
    ShowMessage(
    'title='+MessageJO.GetValue('title').Value+#13#10+
    'body='+MessageJO.GetValue('body').Value
    );
 
 
 
 FreeAndNil(OriginalJSONObject);
 
end;
Я так понимаю к вложенным структурам надо подбираться последовательно.

Добавлено через 4 минуты
Вот ещё пример
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
{
  "Sucess": true,
  "Msg": "OK",
  "SomeJsonObject": {
    "First": 0,
    "Next": true,
    "Total": 60,
    "Items": [
      {
        "ID": 212121,
        "Name": "SomeName",
        "LcID": 9898,
        "Oclao": false,
        "Lal": {
          "ID": 12202,
          "Name": "SomeName1",
          "Pais": "Brasil",
          "Dtc": 0.0
        },
        "Subtype": {
          "ID": 7458,
          "Desc": "mnmnmnmnn"
        },
        "Type": {
          "Sit": "cor1",
          "Sitrm": 0,
          "Name": "SomeName3"
        },
        "Qtde": 0,
        "Qntcoes": 0,
        "Pubum": "adfsdfsdfs",
        "Evias": {
          "arq": {
            "Mo": [
              "site.com"
            ],
            "Moir": [
              "SomeSite.com"
            ]
          }
        }
      },
      {
        "ID": 9797878,
        "Name": "SomeName4",
        "LcID": 9898,
        "Oclao": false,
        "Lal": {
          "ID": 12332,
          "Name": "SomeName5",
          "Pais": "Brasil",
          "Dtc": 0.0
        },
        "Subtipo": {
          "ID": 7458,
          "Desc": "mnmnmnmnn"
        },
        "Tipo": {
          "Sit": "cor1",
          "Sitrm": 0,
          "Name": "SomeName5"
        },
        "Qtde": 0,
        "Qntcoes": 0,
        "Pubum": "SomeName6",
        "Evias": {
          "arq": {
            "Mo": [
              "site.com"
            ],
            "Moir": [
              "site.com"
            ]
          }
        }
      }
    ]
  }
}
Delphi
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
procedure TfParseComplicatedJSON.ParseComplJson;
 
var
   OriginalJSONObject, SomeJsonObject, joItem: TJSONObject;
   joItems: TJSONArray;
   OriginJsonString, Msg: String;
   Success:Boolean;
   i: Integer;
 
 begin
  OriginJsonString := MemoSource.Lines.Text; // original JSON without added braces around it
  OriginalJSONObject := TJSONObject.ParseJSONValue(OriginJsonString) as TJSONObject;
 
     Success :=  OriginalJSONObject.GetValue('Success') is TJSONTrue;
  // if you are using Delphi 10 Seattle or later, you can use this instead:
 //  bSuccess := (OriginalJSONObject.GetValue('Success') as TJSONBool).AsBoolean;
 
  if not Success then MemoDest.Lines.Add('Success=true') else
   MemoDest.Lines.Add('Success=false');
 
// MemoDest.Lines.Add('Success='+Success);
 
 
  Msg := OriginalJSONObject.GetValue('Msg').Value;
  MemoDest.Lines.Add('Msg='+Msg);
 
  SomeJsonObject := OriginalJSONObject.GetValue('SomeJsonObject') as TJSONObject;
  // use joRet.GetValue() as needed ...
 
// Names from array items
 
  MemoDest.Lines.Add('Names from array items');
  joItems := SomeJsonObject.GetValue('Items') as TJSONArray;
 
  for i := 0 to joItems.Count-1 do
  begin
    joItem := joItems.Items[i] as TJSONObject;
    // use joItem.GetValue() as needed ...
    MemoDest.Lines.Add ('Name='+joItem.GetValue('Name').Value);
 
  end;
 
 
FreeAndNil(OriginalJSONObject);
 
end;
1
20.11.2016, 16:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2016, 16:29
Помогаю со студенческими работами здесь

Парсинг JSON
Имеется...

Парсинг JSON
{"news":,"server":{"login":true,"game":true,"online":"26"},"player":{"name":"Рамон","img":"http:\/\/......

Парсинг JSON, реально ли?
Реально ли парсить JSON? С помощью чего и как, обьясните пожалуйста. Спасибо.

Парсинг JSON из TMemo
Всех с Новым Годом! Доброго времени суток. Ребят подскажите. Делаю запрос. Результат гружу в TMemo....


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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