Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

[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
Antworten 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?
Antworten 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
Antworten Top


Gehe zu:


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