AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

JSON mit Punkt im Namen

Ein Thema von Andreas Schilling · begonnen am 5. Apr 2023 · letzter Beitrag vom 6. Apr 2023
Antwort Antwort
Andreas Schilling

Registriert seit: 6. Sep 2006
106 Beiträge
 
Delphi 10.3 Rio
 
#1

JSON mit Punkt im Namen

  Alt 5. Apr 2023, 10:41
Den Abruf eines JSON-Objekt bekomme ich hin. Sieht dann so aus
Delphi-Quellcode:
{
    "pagination": {
     
    }
,
    "data": [
        {
            "id": 158,
            ....
            "initialConfig": {
                "APN": "iot.1nce.net",
                ...
            }
,
            "properties": {
                "debug.monitor": {
                    "name": "debug.monitor",
                    "value": "...",
                    "updatedAt": "2023-01-31T09:23:15.611854289Z"
                }
,
                ....
                "platform.wmbus.receivedMeters": {
                    "name": "platform.wmbus.receivedMeters",
                    "value": [
                        "01280XXX",
                        "03780XXX",
                        ....
                    ],

Das Auslesen von ID funktioniert mit:

sID := JSONValue.GetValue<string>('data['+inttostr(i)+'].id');
Das Auslesen "initialConfig": { "APN": "iot.1nce.net", funktioniert auch mit

sAPN := JSONValue.GetValue<string>('data['+inttostr(i)+'].initialConfig.APN');
Aber wenn ein Punkt im Knotennamen ist "properties": { "debug.monitor": { "name" ... kommt eine Fehlermeldung "Wert'data[0].properties.debug.monitor.name' nicht gefunden" bei

sProperties_3 := JSONValue.GetValue<string>('data['+inttostr(i)+'].properties.debug.monitor.name');
Wie würde der Syntax bei dieser Bedingung lauten?

Gruß Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#2

AW: JSON mit Punkt im Namen

  Alt 5. Apr 2023, 11:05
Vielleicht mit " oder ' oder \ escapen
Delphi-Quellcode:
sProperties_3 := JSONValue.GetValue<string>('data['+inttostr(i)+'].properties."debug.monitor".name');

sProperties_3 := JSONValue.GetValue<string>('data['+inttostr(i)+'].properties.''debug.monitor''.name');

sProperties_3 := JSONValue.GetValue<string>('data['+inttostr(i)+'].properties.debug\.monitor.name');
oder kann man eventuell auch \ bzw. / als Node-Separator benutzen?
Delphi-Quellcode:
sProperties_3 := JSONValue.GetValue<string>('data['+inttostr(i)+']\properties\debug.monitor\name');

sProperties_3 := JSONValue.GetValue<string>('data['+inttostr(i)+']\\properties\\debug.monitor\\name');

sProperties_3 := JSONValue.GetValue<string>('data['+inttostr(i)+']/properties/debug.monitor/name');
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Apr 2023 um 11:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#3

AW: JSON mit Punkt im Namen

  Alt 5. Apr 2023, 11:20


Delphi-Quellcode:
  /// <summary> Parses a JSON path with names and indexes.</summary>
  /// <remarks>
  /// The syntax to write paths is similar to XPath but in a Json way.
  /// The following XPath expression:
  /// /entities/urls[0]/indices[1]
  /// would look like
  /// entities.urls[0].indices[1] (dot notation)
  /// or
  /// entities["urls"][0]["indices"][1] (bracket notation)
  ///
  /// The dot (.) token is used to access the object elements:
  /// ex: object.key
  ///
  /// The bracket ([]) token is used to access array or object elements:
  /// In array: cities[0]
  /// In object: city["name"] or city['name']
  /// In object: ["city"]["name"] or ['city']['name']
  ///
  /// The quote (" or ') is used to introduce a literal when the element is being written in bracket notation:
  /// ex:["first"]["second"] or ['first']['second']
  ///
  /// To escape the quote in a literal use backslash (\): \"
  /// ex: ["quotes(\").should.be.escaped"] or ['quotes(\').should.be.escaped']
  ///
  /// Note: The backslash will only escape quotes within a literal. Bracket notation can be useful when
  /// names can not be written in dot notation, like the objects keys with dot characters:
  /// ex: object["key.with.dots"] or object['key.with.dots']
  ///
  /// </remarks>
  TJSONPathParser = record
Zitat:
Note: The backslash will only escape quotes within a literal. Bracket notation can be useful when
names can not be written in dot notation, like the objects keys with dot characters
:
ex: object["key.with.dots"] or object['key.with.dots']
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Andreas Schilling

Registriert seit: 6. Sep 2006
106 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: JSON mit Punkt im Namen

  Alt 5. Apr 2023, 11:57
Das hier hat jetzt funktioniert

sProperties_3 := JSONValue.GetValue<string>('data['+inttostr(i)+']["properties"]["debug.monitor"]["name"]');
Danke für die Hinweise. Ein paar Sachen hatte ich schon vorher ausprobiert aber auf ["..."] wäre ich nicht gekommen.

Gruß Andreas
  Mit Zitat antworten Zitat
Andreas Schilling

Registriert seit: 6. Sep 2006
106 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: JSON mit Punkt im Namen

  Alt 6. Apr 2023, 05:22
Eigentlich müsste ich den Namen des Thema etwas anpassen, weil es geht zwar um den gleichen JSON-Abruf aber um den nächsten Schritt.

Delphi-Quellcode:
"platform.wmbus.receivedMeters": {
                    "name": "platform.wmbus.receivedMeters",
                    "value": [
                        "01280XXX",
                        "03780XXX",
                        ....
                    ],

Im letzten Teil des Ausschitt oben gibt es ein Unter-Array "value", aber nicht in der Form wie ich es in Beispielen gefunden habe mit
[{"name" : ..., "Bez": ...} { ... }]
sondern wie es oben zu sehen ist. Alle Varianten welche ich probiert habe bringen keinen Fehler sondern liefern nur nil zurück. Ich habe versucht jeden einzelnen "data"-Abschnitt in ein eigens Objekt zu packen was funktioniert und mit dem weiter gearbeitet. Aber solche Abfrgaen liefern nichts zurück

JsonArray2 := JsonObj2.GetValue('["properties"]["platform.wmbus.receivedMeters"]["value"]') as TJSONArray;

Gruß Andreas
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: JSON mit Punkt im Namen

  Alt 6. Apr 2023, 06:51
Delphi-Quellcode:
const
  jsonString = '{ "properties": { ' +
               ' "platform.wmbus.receivedMeters": { '+
               ' "name": "platform.wmbus.receivedMeters", '+
               ' "value": [ '+
               ' "01280XXX", '+
               ' "03780XXX" '+
               ' ]}}}';

var
  jsonArray: TJsonArray;
  jsonObj: TJsonObject;

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    jsonObj := TJSONObject.ParseJSONValue(jsonString) as TJSONObject;
    jsonArray := JsonObj.GetValue<TJsonArray>('["properties"]["platform.wmbus.receivedMeters"]["value"]');
    if jsonArray.Count > 0 then
      writeLn(jsonArray.Items[0].GetValue<String>);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
funktioniert tadellos.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Andreas Schilling

Registriert seit: 6. Sep 2006
106 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: JSON mit Punkt im Namen

  Alt 6. Apr 2023, 07:28
Danke Klaus, funktioniert. Hast gleich meine noch garnicht gestellte Frage beantwortet wie man aus so einem Array dann den Wert ausliest.

sSerNr := jsonArray2.Items[k].GetValue<String>;
Gruß Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#8

AW: JSON mit Punkt im Namen

  Alt 6. Apr 2023, 09:16
Das geht ebenfalls, wie du es ja schon benutzt hatttest, also GetItem('data[0]') , nur Nummer ohne " um den "Namen" .

Beachten solltest du aber, dass "data" ein Array ist, worin (mindestens) im ersten Wert ein Object liegt.
"data" : [ { vs. Data direkt als Object "data" : { .
Das Objekt ist also SubItem/-Node von data[0], nicht nur von data,
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 6. Apr 2023 um 09:20 Uhr)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#9

AW: JSON mit Punkt im Namen

  Alt 6. Apr 2023, 09:25
Im letzten Teil des Ausschitt oben gibt es ein Unter-Array "value", aber nicht in der Form wie ich es in Beispielen gefunden habe mit
[{"name" : ..., "Bez": ...} { ... }]
Kurzer Klugscheißer-Hinweis, um zukünftige Missverständnisse zu vermeiden: das, was du da beschreibst als das, was du in den Beispielen gefunden hast, ist kein Array, sodern ein JSON-Objekt. Ein Objekt besteht immer aus einem Paar Eigenschaftsname+Wert. Der Wert kann dabei ein String, eine Nummer, ein Boolen, selbst wiederum ein Objekt oder eben ein echtes Array sein. In deinem Beispiel ist erst das, was du unter "value" hast, tatsächlich ein Array, erkennbar am [ und ].

Hilft dann wahrscheinlich auch, die Umsetzung der JSON-Bibliothek in Delphi etwas besser nachvollziehen zu können.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz