JSON

JavaScript Object Notation (JSON) ist ein beliebtes und einfaches Datenaustauschformat. ArcGIS Velocity kann anhand von IoT-Beobachtungsdaten (Internet of Things, Internet der Dinge) aus vielfältigen Quellen generiertes JSON verwenden.

Das Datenformat JSON wird für die folgenden Feed- und Datenquellentypen unterstützt:

  • Feeds: Azure Event Hub, Azure Service Bus, AWS IoT, Cisco Edge Intelligence, HTTP-Poller, HTTP-Empfänger, Kafka, WebSocket, RabbitMQ und MQTT
  • Datenquellen: Azure Blob Storage, Amazon S3 und HTTP-Poller

Festlegen der JSON-Konfiguration

Beim Konfigurieren eines Feeds oder einer Datenquelle wird anhand von Stichproben der Typ der verwendeten Daten ermittelt. Wenn anhand der Stichproben ermittelt wird, dass die Daten im JSON-Format vorliegen, können die folgenden zusätzlichen Parameter für die JSON-Konfiguration festgelegt werden.

Stammknoten

Geben Sie ggf. den Stammknoten der JSON-Struktur an, in der sich Nachrichten befinden. Lassen Sie das Feld leer, wenn die JSON-Struktur alle Nachrichten in einem Array auf der Stammebene enthält. In den folgenden JSON-Beispieldaten weist der Code mehrere Ebenen und Objekte auf:

{
  "requestInfo": {
    "requestTime": 1573591345,
    "requestingUser": "Greg Smith"
  },
  "responseInfo": {
    "dataLastUpdated": 1573239432
  },
  "sensorData": [{
    "vehicleID": "17256",
    "driverName": "Peter Jones",
    "latitude": 35.21027,
    "longitude": -81.291326,
    "speed": 64.3,
    "heading": 161.34,
    "status": "Out for delivery",
    "lastBreak": 1573591581
  }, {
    "vehicleID": "11954",
    "driverName": "Frank Jenkins",
    "latitude": 35.23425,
    "longitude": -81.092657,
    "speed": 25.8,
    "heading": 54.64,
    "status": "Returning to warehouse",
    "lastBreak": 1573581253
  }]
}

Wenn der Stammknoten "sensorData" festgelegt wurde, werden in Velocity nur die folgenden Daten verwendet:

[{
  "vehicleID": "17256",
  "driverName": "Peter Jones",
  "latitude": 35.21027,
  "longitude": -81.291326,
  "speed": 64.3,
  "heading": 161.34,
  "status": "Out for delivery",
  "lastBreak": 1573591581
}, {
  "vehicleID": "11954",
  "driverName": "Frank Jenkins",
  "latitude": 35.23425,
  "longitude": -81.092657,
  "speed": 25.8,
  "heading": 54.64,
  "status": "Returning to warehouse",
  "lastBreak": 1573581253
}]

Daraus ergibt sich das folgende abgeleitete Schema:

Resultierende Seite "Schema bestätigen" mit festgelegtem Stammknoten sensorData

Reduzieren

Mit dem Parameter Reduzieren wird festgelegt, ob geschachtelter JSON-Code in mehrere Felder unterteilt wird. Die Benennung der neuen Felder erfolgt, indem an den Namen des Objekts der höheren Ebene der Name des Objekts der niedrigeren Ebene mit einem Unterstrich angehängt wird. Im folgenden Beispiel enthält das Objekt position die Objekte latitude und longitude. Durch Reduzieren wird das position-Objekt in die zwei Felder position_latitude und position_longitude unterteilt.

Beim Anwenden von "Reduzieren" kann der JSON-Code mit mehreren Ebenen geschachtelt werden. In den neuen Feldnamen nach der Reduzierung werden Objektnamen mit einem Unterstrich angehängt, bis die unterste Objektebene erreicht wird.

Beispielsweise weist der folgende JSON-Beispielcode die Objekte position und vehicleInformation auf:

[{
  "vehicleID": "17256",
  "driverName": "Peter Jones",
  "position": {
    "latitude": 35.21027,
    "longitude": -81.291326
  },
  "vehicleInformation": {
    "lastService": 1571431836,
    "warningCodes": 2
  },
  "speed": 64.3,
  "heading": 161.34,
  "status": "Out for delivery",
  "lastBreak": 1573591581
}, {
  "vehicleID": "11954",
  "driverName": "Frank Jenkins",
  "position": {
    "latitude": 35.23425,
    "longitude": -81.092657
  },
  "vehicleInformation": {
    "lastService": 1560531836,
    "warningCodes": 2
  },
  "speed": 25.8,
  "heading": 54.64,
  "status": "Returning to warehouse",
  "lastBreak": 1573581253
}]

Wenn der Parameter Reduzieren aktiviert ist, wird der obige JSON-Beispielcode wie folgt verarbeitet, wobei die Elemente in den Objekten position und vehicleInformation in die jeweiligen Felder unterteilt werden:

[{
  "vehicleID": "17256",
  "driverName": "Peter Jones",
  "position_latitude": 35.21027,
  "position_longitude": -81.291326,
  "vehicleInformation_lastService": 1571431836,
  "vehicleInformation_warningCodes": 2,
  "speed": 64.3,
  "heading": 161.34,
  "status": "Out for delivery",
  "lastBreak": 1573591581
}, {
  "vehicleID": "11954",
  "driverName": "Frank Jenkins",
  "position_latitude": 35.23425,
  "position_longitude": -81.092657,
  "vehicleInformation_lastService": 1560531836,
  "vehicleInformation_warningCodes": 2,
  "speed": 25.8,
  "heading": 54.64,
  "status": "Returning to warehouse",
  "lastBreak": 1573581253
}]

Das Schema wird wie unten dargestellt verwendet: Während die Feldnamen vehicleInformation_lastService und vehicleInformation_warningCodes auf der Benutzeroberfläche abgeschnitten werden, bleiben sie in der Anwendung jedoch intakt:

Seite "Schema bestätigen" nach dem Reduzieren des JSON-Codes

Reduzierungsausnahmen

Mit dem Parameter Reduzierungsausnahmen können Sie JSON-Elementnamen angeben, die als einzelnes Zeichenfolgenelement erhalten bleiben sollen, anstatt in mehrere Felder unterteilt zu werden, wie beispielsweise ein JSON-Objekt, das ein Array oder ein Objekt darstellt, das andere Elemente enthält. Betrachten Sie den folgenden JSON-Beispielcode:

[{
  "ship_ID": "17256",
  "call_sign": "3FCB8",
  "ship_type": "Cargo",
  "last_known_position": {
    "timestamp": "2019-06-24T18:30:56+00:00",
    "geometry": {
      "type": "Point",
      "coordinates": [
        79.19315,
        7.18374
      ]
    },
    "heading": 109
  }
}, {
  "ship_ID": "29435",
  "call_sign": "9GEF3",
  "ship_type": "Passenger",
  "last_known_position": {
    "timestamp": "2019-06-24T18:30:47+00:00",
    "geometry": {
      "type": "Point",
      "coordinates": [
        73.24954,
        10.43512
      ]
    },
    "heading": 120
  }
}]

Wenn der Parameter Reduzieren aktiviert und ein Wert von geometry für Reduzierungsausnahmen angegeben ist, wird der obige JSON-Beispielcode wie unten gezeigt behandelt. Im Feld last_known_position_geometry ist keine Unterteilung des JSON-Objekts durch Reduzierung erfolgt. Der Grund dafür ist, dass das ursprüngliche JSON-Element geometry im Parameter Reduzierungsausnahmen angegeben wurde. Dies ist hilfreich, wenn JSON-Objekte beibehalten werden sollen. Dies ist häufig der Fall, wenn das Geometrieobjekt die räumliche Position von Features darstellt. In diesem Fall weist das Attribut das GeoJSON-Geometrieformat auf.

[{
  "ship_ID": "17256",
  "call_sign": "3FCB8",
  "ship_type": "Cargo",
  "last_known_position_timestamp": "2019-06-24T18:30:56+00:00",
  "last_known_position_geometry": {
    "type": "Point",
    "coordinates": [
      79.19315,
      7.18374
    ]
  },
  "last_known_position_heading": 109
}, {
  "ship_ID": "29435",
  "call_sign": "9GEF3",
  "ship_type": "Passenger",
  "last_known_position_timestamp": "2019-06-24T18:30:47+00:00",
  "last_known_position_geometry": {
    "type": "Point",
    "coordinates": [
      73.24954,
      10.43512
    ]
  },
  "last_known_position_heading": 120
}]

Das Schema wird wie unten dargestellt verwendet, und es kann festgelegt werden, dass die Positionsinformationen des Feeds oder der Datenquelle aus einem einzelnen Feld abgeleitet werden.

Resultierende Seite "Schema bestätigen", wenn der JSON-Code reduziert ist und das geometry-Feld von der Reduzierung ausgenommen wurde

Arrays reduzieren

Mit dem Parameter Arrays reduzieren wird festgelegt, ob Arrays auf mehrere Felder reduziert werden sollen. Die Benennung neuer Felder erfolgt, indem der Wert arrayName mit einem Unterstrich und der Nummer des Array-Objekts angehängt wird. Wenn es sich bei dem Array um ein Array von Objekten handelt, wird an den Feldnamen auch ein Unterstrich und der mit dem Wert verknüpfte Name angehängt. Beim Anwenden von "Reduzieren" auf Arrays von Objekten kann der JSON-Code mit mehreren Ebenen geschachtelt werden. In den neuen Feldnamen nach der Reduzierung werden einfach Objektnamen mit einem Unterstrich angehängt, bis das unterste Objekt erreicht wird.

Zum Beispiel weist der folgende JSON-Beispielcode das cargoInformation-Array-Objekt auf:

{
    "name": "iss",
    "id": 25544,
    "latitude": -13.210305423781,
    "longitude": -118.47517068897,
    "velocity": 27564.442053654,
    "visibility": "daylight",
    "cargoInformation": [{
            "sensorsID": 1,
            "age": 5432
        }, {
            "sensorsID": 2,
            "age": 9876
        }
    ],
    "footprint": 4521.609615023,
    "timestamp": 1654531549,
    "daynum": 2459737.170706,
    "solar_lat": 22.696540649846,
    "solar_lon": 298.23268983658,
    "units": "kilometers"
}

Wenn der Parameter Arrays reduzieren aktiviert ist, wird der obige JSON-Beispielcode wie folgt verarbeitet, wobei die Elemente im Objekt "cargo information" in die jeweiligen Felder unterteilt werden:

{
    "name": "iss",
    "id": 25544,
    "latitude": -13.210305423781,
    "longitude": -118.47517068897,
    "velocity": 27564.442053654,
    "visibility": "daylight",
    "cargoInformation_0_sensorsID": 1,
    "cargoInformation_0_age": 5432,
    "cargoInformation_1_sensorsID": 2,
    "cargoInformation_1_age": 9876,
    "footprint": 4521.609615023,
    "timestamp": 1654531549,
    "daynum": 2459737.170706,
    "solar_lat": 22.696540649846,
    "solar_lon": 298.23268983658,
    "units": "kilometers"
}

Das Schema wird wie unten dargestellt verwendet: Während die cargoInformation-Feldnamen auf der Benutzeroberfläche abgeschnitten werden, bleiben sie in der Anwendung jedoch intakt:

Array-Reduzierung im JSON-Format

Array-Reduzierungsausnahmen

Mit dem Parameter Array-Reduzierungsausnahmen können Sie JSON-Array-Namen angeben, die als einzelnes Zeichenfolgenelement erhalten bleiben und nicht in mehrere Felder unterteilt werden sollen. Betrachten Sie den folgenden JSON-Beispielcode:

{
    "name": "iss",
    "id": 25544,
    "latitude": -13.210305423781,
    "longitude": -118.47517068897,
    "velocity": 27564.442053654,
    "visibility": "daylight",
    "cargoInformation": [{
            "sensorsID": 1,
            "age": 5432
        }, {
            "sensorsID": 2,
            "age": 9876
        }
    ],
    "sensorValues": [1,2,3,4,5],
    "footprint": 4521.609615023,
    "timestamp": 1654531549,
    "daynum": 2459737.170706,
    "solar_lat": 22.696540649846,
    "solar_lon": 298.23268983658,
    "units": "kilometers"
}

Wenn der Parameter Arrays reduzieren aktiviert und ein Wert von sensorValues für Array-Reduzierungsausnahmen angegeben ist, wird der obige JSON-Beispielcode wie unten gezeigt behandelt. Im Array sensorValues wird das Array-Objekt nicht durch Reduzierung unterteilt und als Zeichenfolge beibehalten. Um festzulegen, dass mehrere Arrays von der Reduzierung ausgenommen werden sollen, geben Sie sie im Parameter Array-Reduzierungsausnahmen durch Kommas getrennt an.

{
    "name": "iss",
    "id": 25544,
    "latitude": -13.210305423781,
    "longitude": -118.47517068897,
    "velocity": 27564.442053654,
    "visibility": "daylight",
    "cargoInformation_0_sensorsID": 1,
    "cargoInformation_0_age": 5432,
    "cargoInformation_1_sensorsID": 2,
    "cargoInformation_1_age": 9876,
    "sensorValues": [1,2,3,4,5],
    "footprint": 4521.609615023,
    "timestamp": 1654531549,
    "daynum": 2459737.170706,
    "solar_lat": 22.696540649846,
    "solar_lon": 298.23268983658,
    "units": "kilometers"
}

Das Schema wird wie unten dargestellt verwendet:

JSON-Array-Reduzierungsausnahmen

Überlegungen und Beschränkungen

Berücksichtigen Sie beim Arbeiten mit Daten im JSON-Format in Velocity die folgenden Informationen und Beschränkungen.

JSON-Daten, die Arrays enthalten

Arrays bieten in JSON Flexibilität, stellen jedoch beim Konstruieren von ArcGIS-Features aus JSON-Daten wegen ihrer unbestimmten Länge eine Herausforderung dar. Wenn das gesamte Dokument oder ein definierter Stammknoten ein Array von Objekten darstellt, werden einzelne Objekte als separate Features verarbeitet. Arrays im JSON-Objekt werden als Zeichenfolgen abgeleitet. Die weitere Verarbeitung dieser Zeichenfolgen kann mit Analysewerkzeugen erfolgen.

NULL-Datenwerte

Im JSON-Format werden die Daten als Name-Wert-Paare dargestellt. Viele Anwendungen, die Daten im JSON-Format erstellen, lassen das Namensobjekt aus, wenn ein Wert NULL ist.

Dies muss beachtet werden, wenn Sie einen Feed oder einen Datenquelle konfigurieren oder bearbeiten. Velocity entnimmt aus dem Daten-Stream oder den Datendateien Stichproben, um daraus das Datenformat und Schema zu ermitteln. Wenn keine der zurückgegebenen Stichproben JSON-Elemente enthält, da sie NULL-Werte aufweisen, werden diese Felder aus dem Feed- oder Datenquellenschema ausgelassen.

Deshalb können zu einem späteren Zeitpunkt eingehende Nachrichten, die Datenwerte für diese JSON-Elemente aufweisen, nicht in Beobachtungen oder Datensätze aufgelöst werden, die von Feeds oder Analysen in Velocity verarbeitet werden können.

Abgeleitete Feldtypen

Da generische JSON-Daten nicht stark typisiert sind, müssen die aus den Stichproben abgeleiteten Feldtypen möglicherweise korrigiert werden. Beim Ändern von Feldtypen ist Vorsicht geboten. Es wird empfohlen, die Inklusivität von Feldtypen zu erhöhen, statt sie zu verringern. Beispielsweise lässt sich aus einer kleinen Stichprobenmenge eventuell nicht ersehen, dass ein bestimmter Feldwert vom Typ Float64 und nicht vom Typ Float32 sein sollte.

Außerdem wird nicht empfohlen, Felder vom Typ Float (Float64 oder Float32) in einen Integer-Typ (Int64 oder Int32) zu ändern. Auch das Ändern von Feldtypen ist nicht für die On-the-fly-Konvertierung numerischer Werte empfehlenswert. Bei JSON-Daten bewirkt das Herabstufen von Float auf Integer, dass der Dezimalteil entfernt wird, ohne die Zahl zu runden. Verwenden Sie zum Konvertieren oder Transformieren numerischer Werte die Option Feld berechnen oder Felder zuordnen.

Größe der JSON-Datei

Bei JSON-Dateien empfiehlt sich eine Größe von unter 100 MB pro Datei in Velocity. Wenn Sie eine größere Datenmenge haben, teilen Sie die Dateien so auf, dass jede Datei weniger als 100 MB groß ist.