Obsługa JSON w Delphi XE7

0

Witam i pytam:
Mam takiego oto JSONa:

[{
"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

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?

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):

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

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.

0

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

Przykładowa zabawa z JSONem:

{$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:

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

0

tutaj mały helpik

1 użytkowników online, w tym zalogowanych: 0, gości: 1