[LAMBDA] JSON.TORANGE
#1
Moin,

eine noch experimentelle LAMBDA-Funktion, die einfach strukturierte JSON-Daten mit einer Ebene direkt per URL in einen Bereich umwandelt.
Klar, man könnte PowerQuery verwenden, ich hätte aber gerne eine Formel. Ein Beispielaufruf wäre dann zum Beispiel:

JSON.TORANGE(WEBDIENST("https://jsonplaceholder.typicode.com/posts"))

Code:
=LAMBDA(Data;LET(
  fnSplit;LAMBDA(T;S;LET(U;TEIL(S&T&S;SEQUENZ(LÄNGE(S&T&S));LÄNGE(S));N;SEQUENZ(ZEILEN(U));
          V;WENN(U=S;WENN(N>1;N-LÄNGE(S);N);0);F;FILTER(V;V>0);X;SEQUENZ(ZEILEN(F)-1);
          TEIL(T;INDEX(F;X;1)+WENN(X>1;LÄNGE(S);0);INDEX(F;X+1;1)-INDEX(F;X;1)-WENN(X>1;LÄNGE(S);0))));
  fnProperty;LAMBDA(T;S;TEIL(T;1+FINDEN(ZEICHEN(1);WECHSELN(T;S;ZEICHEN(1);LÄNGE(T)-LÄNGE(WECHSELN(T;S;""))));LÄNGE(T)));
  fnValue;LAMBDA(T;S;LET(U;WECHSELN(WECHSELN(T;", "&ZEICHEN(34);","&ZEICHEN(34));","&ZEICHEN(34);ZEICHEN(1)&ZEICHEN(34))&ZEICHEN(1);
          V;ZEICHEN(34)&S&ZEICHEN(34)&":";N;WENNFEHLER(LÄNGE(V)+FINDEN(V;U;1);0);
          P;WENNFEHLER(FINDEN(ZEICHEN(1);U;N+1);0);GLÄTTEN(WENN(N*P>0;TEIL(U;N;P-N);""))));
  fnType;LAMBDA(T;LET(U;T;V;WENN((LINKS(U;1)=ZEICHEN(34))*(RECHTS(U;1)=ZEICHEN(34))>0;2;
         WENN(ISTZAHL(--U);3;WENN((KLEIN(U)="false")+(KLEIN(U)="true")>0;4;1)));
         WAHL(V;U;WECHSELN(WECHSELN(TEIL(U;2;LÄNGE(U)-2);ZEICHEN(2);ZEICHEN(34));"\n";
         ZEICHEN(10));--WECHSELN(U;".";""& TEIL(1/2;2;1));WENN(U<>"true";FALSCH;WAHR))));
  S;WECHSELN(WECHSELN(WECHSELN(GLÄTTEN(SÄUBERN(Data));"}, {";"},{");"},{";"}"&ZEICHEN(1)&"{");"\"&ZEICHEN(34); ZEICHEN(2));
  A;fnSplit(GLÄTTEN(WENN(LINKS(S;1)="[";TEIL(S;2;LÄNGE(S)-2);S));ZEICHEN(1));
  H;LET(U;fnSplit(INDEX(A;1;1);ZEICHEN(34)&":");fnProperty(INDEX(U;SEQUENZ(1;ZEILEN(U)-1);1);ZEICHEN(34)));
  X;SEQUENZ(1+ZEILEN(A));
  Y;SEQUENZ(1;SPALTEN(H));
    WENN(X>1;fnType(fnValue(GLÄTTEN(TEIL(INDEX(A;X-1;1);2;LÄNGE(INDEX(A;X-1;1))-2));INDEX(H;1;Y)));INDEX(H;1;Y))))

Wie zu sehen, nutzt JSON.TORANGE intern weitere LAMBDAs. Es fehlen z.B. noch eine Erkennung für Datumsangaben oder eine vollständige
Erkennung von Zahlenformaten, also z.B. in exponentieller Schreibweise. Und testen von diversen JSON-Api, die den Regeln folgen.

Wenn da jemand Ideen hat ...

Gruß
Microsoft Excel Expert · Microsoft Most Valuable Professional (MVP) :: 2011-2019 & 2020-2022 :: 10 Awards
https://de.excel-translator.de/translator :: Online Excel-Formel-Übersetzer :: Funktionen :: Fehlerwerte :: Argumente :: Tabellenbezeichner
Top
#2
Hallo maninweb,

da ich nur eine der 4 Sub-LAMBDAs mehr als einmal (fnSplit) aufgerufen sehe: Die anderen 3 gliederst Du vermutlich nur für eine erhöhte Übersichtlichkeit aus, oder?

Inhaltlich kenne ich JSON genausowenig wie XML (habe nie mit Datenaustausch zu tun), habe aber eben gelesen, dass man Datensätze beliebig tief verschachteln kann. Vermutlich hast Du daher auch Rekursionen mit drin?
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Top
#3
Hallo LCohen,

richtig, die anderen LAMBDAs habe ich im Wesentlichen wegen der Übersichtlichkeit angelegt, da die ja schon in sich recht lang sind.

Die Funktion erkennt aber hier nur JSON-Daten, die maximal eine Ebene haben (wie z.B. im Aufruflink von typicode). Eine Rekursion ist derzeit nicht enthalten.
Mehr Ebenen zu berücksichtigen, dürfte ziemlich komplex werden. Das müsste dann ja auch irgendwie auf einen Bereich "gemappt" werden. Und würde,
denke ich mal, das Implementieren eines Parsers oder Ähnliches beinhalten. Da habe ich mich noch nicht mit beschäftigt.

Gruß
Microsoft Excel Expert · Microsoft Most Valuable Professional (MVP) :: 2011-2019 & 2020-2022 :: 10 Awards
https://de.excel-translator.de/translator :: Online Excel-Formel-Übersetzer :: Funktionen :: Fehlerwerte :: Argumente :: Tabellenbezeichner
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste