Obsługa JSON w Delphi XE7

Obsługa JSON w Delphi XE7
maniutek20
  • Rejestracja:około 14 lat
  • Ostatnio:10 dni
  • Postów:138
0

Witam i pytam:
Mam takiego oto JSONa:

Kopiuj
[{
"result": ["pole1", "pole2", "itd"]

}, {
"data": [
["72", "12", "1"],
["73", "12", "1"]

]
}]

Szukam sposobu na wczytanie tego jsona do stringgrida. Przepatrzyłem te wszystkie lkjson, superobject, a nawet wbudowanego system.json, ale cały ten towar wydaje mi się raz - jakiś strasznie rozbudowany a 2 - ograniczony. Właściwie to najlepszy byłby jakiś ekwiwalent json_decode z php. Dlaczego? Ano dlatego że nie zawsze wiem jak będzie się nazywało pole1, i nie wiem ile będzie tych pól, generalnie mało wiem o tym JSONie który do mnie trafi


quidquid Latine dictum sit, altum videtur
edytowany 1x, ostatnio: flowCRANE
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0

jak mało wiesz o tym jsonie to jak zamierzasz go wyświetlać? Coś musi być stałe - choćby fakt, że zawsze jest jedna tablica z opisem nagłówków i druga z pozycjami. Jeśli tak jest to co za problem "ręcznie" wygrzebać co Ci potrzeba?


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
2

Musisz to sobie jakoś przetworzyć to nie są proste dane typu nazwa: wartość tylko tablicę dwuwymiarową wiec trzeba trochę pokombinować. Nie wiem czy to najbardziej optymalne rozwiązanie ale przy użyciu class z System.JSON zadziała coś takiego (założyłem że dostajesz poprawne dane na wzór podanych w przykładzie):

Kopiuj
const
  JSON_STR = '[{"result": ["pole1", "pole2", "itd"]}, {"data": [["72", "12", "1"],["73", "12", "1"]]}]';
var
  JsonArray, ColJsonArray, RowJsonArray: TJSONArray;
  JsonPair: TJsonPair;
  i, j: Integer;
begin
  JsonArray:= TJSONObject.ParseJSONValue(JSON_STR) as TJSONArray;
  JsonPair:= TJsonObject(JsonArray.Items[0]).Get('result');
  ColJsonArray:= JsonPair.JsonValue as TJSONArray;
  StringGrid1.RowCount:= 1;
  StringGrid1.ColCount:= ColJsonArray.Count;
  for i:= 0 to ColJsonArray.Count - 1 do //naglowki kolumn
    StringGrid1.Cells[i, 0]:= ColJsonArray.Items[i].Value;
  JsonPair:= TJsonObject(JsonArray.Items[1]).Get('data');
  RowJSONArray:= JsonPair.JsonValue as TJSONArray;
  StringGrid1.RowCount:= RowJsonArray.Count + 1;
  for i:= 0 to RowJsonArray.Count - 1 do //dane
  begin
    ColJsonArray:= RowJsonArray.Items[i] as TJSONArray;
    for j:= 0 to ColJsonArray.Count - 1 do
      StringGrid1.Cells[j, i+1]:= ColJsonArray.Items[j].Value;
  end;
  StringGrid1.FixedRows:= 1;
  StringGrid1.FixedCols:= 0;
end;

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek
DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:12 dni
  • Postów:105
1

Jest fajny lib do obsługi JSON / XML
https://github.com/hgourvest/superobject

0

Zmapuj sobie automatycznie na pola klas. Tak jak to się robi w javie albo c#. Każda nowoczesna technologia to ma

KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
0

Pewnie że w Delphi też można tylko trzeba mieć z czego coś generować np. z http://4programmers.net/Pastebin/5740 dostaniesz http://4programmers.net/Pastebin/5742 ale z tej struktury co on ma:

[{"result": ["pole1", "pole2", "itd"]}, {"data": [["72", "12", "1"],["73", "12", "1"]]}]
nie dostaniesz nic co coś da ponad to co oferują standardowe klasy (tyle że co najwyżej sobie dobierzesz nawy np. Fields zamiast Items). Przecież większość kodu który napisałem wyżej służy to wpisania do Grida dlatego jest go aż tyle. Pokaż co dla Java albo C# z tego wygenerujesz to razem się pośmiejemy.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: Adam Boduch
hnb
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 2 lata
  • Postów:28
0

Do obsługi JSON polecam framework mORMot (http://synopse.info/).

Przykładowa zabawa z JSONem:

Kopiuj
{$APPTYPE CONSOLE}

uses
  SynCommons;

var
  j: Variant;
  i: integer;
begin
  j := _JsonFast('[{"result": ["pole1", "pole2", "itd"]}, {"data": [["72", "12", "1"],["73", "12", "1"]]}]');
  WriteLn(j._Count);
  for i := 0 to j._Count-1 do
    if j._(i)._Kind = dvObject then
    begin
      if j._(i).Exists('result') then
        WriteLn(j._(i).result);
      if j._(i).Exists('data') then
        if j._(i).Value('data')._Kind = dvArray then
          WriteLn('Tablica data ma ', j._(i)._('data')._Count, ' element(y|ów)');
    end;

Spowoduje wydrukowanie na konsoli:

Kopiuj
2
["pole1","pole2","itd"]
Tablica data ma 2 element(y|ów)

Operacje na JSON za pomocą frameworka mORMot można wykonywać na wiele sposobów, jedne są wolniejsze inne szybsze lecz bardziej "ociężałe" w zastosowaniu. Na początek polecam lekturę:

http://blog.synopse.info/post/2014/02/25/TDocVariant-custom-variant-type


NewPascal.org
edytowany 1x, ostatnio: hnb
M2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 8 lat
0

tutaj mały helpik

edytowany 1x, ostatnio: miniek21
flowCRANE
Następnym razem najpierw sprawdź datę postów, zanim odkopiesz od dawna martwą dyskusję.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.