Obsługa JSON w Delphi XE7

Obsługa JSON w Delphi XE7
maniutek20
  • Rejestracja:prawie 14 lat
  • Ostatnio:4 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:7 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:dzień
  • 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:29 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:dzień
  • 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:około 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:około 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ę.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)