GoPro 9 JSON der Filelist bearbeiten

Alle Fragen zur Netzwerkkommunikation
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

GoPro 9 JSON der Filelist bearbeiten

Beitrag von af0815 »

Hallo,

ich versuche mich an einer GoPro 9 und Verbindung zur Kamera. Ich habe einmal
behelfsmäßig eine Verbindung per WIFI zusammengebracht und kann Kommandos und auch Bilder übertragen.

Wenn ich mir die media liste anzeigen lasse, so bekomme ich folgende Antwort.
{"id":"42028355999999","media":[{"d":"100GOPRO","fs":[{"n":"GH010003.MP4","cre":"1676879235","mod":"1676879235","glrv":"14414304","ls":"-1","s":"154450157"},{"n":"G0010004.JPG","g":"1","b":"4","l":"19","cre":"1676880724","mod":"1676880724","s":"51562722","t":"b","m":[]},{"n":"G0020020.JPG","g":"2","b":"20","l":"21","cre":"1676880918","mod":"1676880918","s":"6617792","t":"b","m":[]},{"n":"GOPR0022.JPG","cre":"1676880927","mod":"1676880927","s":"7491086"},{"n":"GOPR0023.JPG","cre":"1676880982","mod":"1676880982","s":"7751047"},{"n":"GOPR0024.JPG","cre":"1676881090","mod":"1676881090","s":"6565106"}]}]}
Wenn man etwas lesbarer sich anzeigen lässt so sieht man die Struktur schön.
{
"id" : "42028355999999",
"media" : [
{
"d" : "100GOPRO",
"fs" : [
{
"n" : "GH010003.MP4",
"cre" : "1676879235",
"mod" : "1676879235",
"glrv" : "14414304",
"ls" : "-1",
"s" : "154450157"
},
{
"n" : "G0010004.JPG",
"g" : "1",
"b" : "4",
"l" : "19",
"cre" : "1676880724",
"mod" : "1676880724",
"s" : "51562722",
"t" : "b",
"m" : [
]
},
{
"n" : "G0020020.JPG",
"g" : "2",
"b" : "20",
"l" : "21",
"cre" : "1676880918",
"mod" : "1676880918",
"s" : "6617792",
"t" : "b",
"m" : [
]
},
{
"n" : "GOPR0022.JPG",
"cre" : "1676880927",
"mod" : "1676880927",
"s" : "7491086"
},
{
"n" : "GOPR0023.JPG",
"cre" : "1676880982",
"mod" : "1676880982",
"s" : "7751047"
},
{
"n" : "GOPR0024.JPG",
"cre" : "1676881090",
"mod" : "1676881090",
"s" : "6565106"
}
]
}
]
}
Nur wie kann ich das im Code sauber aufdröseln, ja JSON ist absolut nicht meine Stärke.

Anbei ein komplettes Testprojekt. Vielleicht kann mir wer da auf die Sprünge helfen wie ich an die Dateinamen und die anderen Daten komme.
Dateianhänge
goprojson.zip
(139.99 KiB) 86-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
KodeZwerg
Beiträge: 103
Registriert: Mo 6. Feb 2023, 11:04

Re: GoPro 9 JSON der Filelist bearbeiten

Beitrag von KodeZwerg »

Ich habe spaßenshalber mal das \lazarus\tools\jsonviewer\ projekt drüber laufen lassen.
Dateianhänge
Bild_2023-02-20_180546462.png
Bild_2023-02-20_180546462.png (17.29 KiB) 4909 mal betrachtet
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: GoPro 9 JSON der Filelist bearbeiten

Beitrag von af0815 »

Den kenne ich, bringt mich aber nicht weiter. Wie geht das 'zu Fuß'. Weil wie du im angehängten Beispiel siehst, komme ich in die erste Ebene, dann wird es ein Array, das ich nicht schaffe aufzudröseln. Bei dem Wechsel zwischen Objekten und Arrays fehlt mir der Plan.

Genaugenommen interessiert mich nur die Dateinamen (=n), der Rest ist 'nice to have'
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: GoPro 9 JSON der Filelist bearbeiten

Beitrag von theo »

Einfach stupide durchhangeln.

Das erste Element z.B. so:

Code: Alles auswählen

  hstr:= memoSrc.Text;
  jData:= GetJSON(hstr).FindPath('media');
  jData:=TJSONArray(jData)[0].FindPath('fs');
  ShowMessage(TJSONArray(jData)[0].FindPath('n').AsUnicodeString);   

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: GoPro 9 JSON der Filelist bearbeiten

Beitrag von af0815 »

Das heisst das ich mit findPath die Arrays finde. Das nehme ich dann als neues Basis Element. Das heißt dann, das ich beim letzten jData als Array einfach mir die Anzahl der Elemente hole und dann x mal durchiteriere. Ok, das erscheint mir logisch.

Ich wollte das ohne findPath durchiterieren, bin aber dann gescheitert das Arrays scheinbar keine Names Eigenschaften haben, sondern nur die Objekte. Dann habe mal das Problem auf das Beispiel reduziert und damit Effizient die Nerven geschmissen. Bin halt noch auf Records und Collections trainiert, nicht auf so neumodisches Zeug :-)

Hintergrund: Ja ich versuche gerade mich mit den GoPro Kameras zu beschäftigen. Wenn der WLAN läuft ist das nicht die große Hexerei. In OpenGoPro ist da vieles Dokumentiert von den möglichen Befehlen. SO wie es aussieht ist das herunterladen der Bilder, Befehle schicken etc. nicht allzu schwer umzusetzen, die Bilder gehen breits. Was noch eine Herausforderung sein wird, ist die GoPro 9 dazu zu bringen den WLAN zu aktivieren. Das ist leider besch...eiden gelöst. Da muss man mit Bluetotth low energie zuerst sich verbinden, dann Befehle über die Verbindung senden und den WLAN erst aktivieren. Crytisch und nicht unbedingt Cross Platform freundlich. Na ja mal sehen, wie weit ich mit der Unit komme.

Edit:
Danke Theo für den Schubs

Code: Alles auswählen

procedure TForm1.BuTestMe2Click(Sender: TObject);
var
  jData, jArr: TJSONData;
  hstr, FN: String;
  i,anz: integer;
  datuxmode,datuxcre: int64;
  datmode, datcre: TDateTime;
begin
  hstr:= memoSrc.Text;
  jData:= GetJSON(hstr);
  jData:= jData.FindPath('media');
  jArr:=TJSONArray(jData)[0].FindPath('fs');
  anz:= jArr.Count;
  MemoDest.Append('Anz Elemente='+Anz.ToString);
  for i:= 0 to Anz-1 do begin
    FN:= TJSONArray(jArr)[i].FindPath('n').AsString;
    datuxmode:= TJSONArray(jArr)[i].FindPath('mod').AsInt64;
    datmode:= UnixToDateTime(datuxmode,false);
    datuxcre:= TJSONArray(jArr)[i].FindPath('mod').AsInt64;
    datcre:= UnixToDateTime(datuxcre,false);
    MemoDest.Append(FN+' create='+DateTimeToStr(datcre) + ' mod='+DateTimeToStr(datmode) );
  end;
end;
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
KodeZwerg
Beiträge: 103
Registriert: Mo 6. Feb 2023, 11:04

Re: GoPro 9 JSON der Filelist bearbeiten

Beitrag von KodeZwerg »

Da Du im ersten Post nur gefragt hattest wie man es darstellen/auflösen könnte, gab ich den viewer als generisch nutzbare quelle an :lol:
Ja FindPath ist das mittel zum zweck wenn einem die Namen bekannt sind (nicht mehr generisch sondern spezifisch)
Theo war da sehr flott, mist :mrgreen: :lol:
In mORMot/2 ist json auch sehr easy abrufbar integriert und es bietet jede menge mehr Spielzeuge an, vielleicht ist da auch was für deine Kommunikation dabei?
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: GoPro 9 JSON der Filelist bearbeiten

Beitrag von af0815 »

KodeZwerg hat geschrieben:
Mo 20. Feb 2023, 21:56
Da Du im ersten Post nur gefragt hattest wie man es darstellen/auflösen könnte, gab ich den viewer als generisch nutzbare quelle an :lol:
af0815 hat geschrieben:Vielleicht kann mir wer da auf die Sprünge helfen wie ich an die Dateinamen und die anderen Daten komme.
Ich habe genau gefragt, wie ich an die Daten komme.

Übrigends hat es Theo etwas einfacher, wir kennen uns im Forum seit ein paar Tagen und er weis meistens was ich meine und nicht was ich geschrieben habe :-) Alter Schwede, wie die Zeit vergeht - über 15 Jahre.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten