JSON

La notación de objetos de JavaScript (JSON) es un formato de intercambio de datos ligero y popular. ArcGIS Velocity puede usar JSON generado a partir de datos de observación de Internet de las cosas (IoT) a partir de una amplia variedad de fuentes.

JSON se admite como un formato de datos para los siguientes tipos de feed y fuente de datos:

  • Feeds: Azure Event Hub, Azure Service Bus, AWS IoT, Cisco Edge Intelligence, HTTP Poller, HTTP Receiver, Kafka, WebSocket, RabbitMQ, MQTT
  • Fuentes de datos: Azure Blob Storage, Amazon S3, HTTP Poller

Especificar la configuración de JSON

Al configurar un feed o una fuente de datos se realiza un muestreo para identificar el tipo de datos que se emplean. Si el muestreo identifica que los datos son JSON, se pueden especificar los siguientes parámetros adicionales para la configuración JSON:

Nodo raíz

Si corresponde, especifique el nodo raíz de la estructura JSON en la que residen los mensajes. Deje esto en blanco si la estructura JSON contiene todos los mensajes en una matriz en el nivel raíz. Por ejemplo, el siguiente JSON de muestra presenta datos con múltiples niveles y objetos:

{
  "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
  }]
}

Si se ha especificado un nodo raíz de sensorData, solo se usan los siguientes datos en Velocity:

[{
  "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
}]

El resultado es la siguiente derivación del esquema:

Página Esquema de confirmación resultante con nodo raíz sensorData especificado

Aplanar

El parámetro Aplanar determina si el JSON anidado se divide en campos separados. Los nuevos campos se nombran agregando objetos de nivel inferior con un guión bajo al objeto de nivel superior. En el siguiente ejemplo, el objeto position contiene objetos latitude y longitude. Cuando se aplana, el objeto position se divide en dos campos, position_latitude y position_longitude.

Durante el aplanamiento, el JSON puede estar anidado con varios niveles de profundidad. Los nuevos nombres de campo aplanados agregan nombres de objetos con un guión bajo hasta llegar al objeto de nivel más profundo.

Por ejemplo, el siguiente JSON de muestra presenta los objetos position y vehicleInformation:

[{
  "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
}]

Cuando se marca el parámetro Aplanar, el JSON de muestra anterior se procesa de la siguiente manera, en la que los elementos de los objetos position y vehicleInformation se dividen en los campos correspondientes:

[{
  "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
}]

El esquema se utiliza como se ilustra a continuación. Si bien la interfaz de usuario corta los nombres de los campos vehicleInformation_lastService y vehicleInformation_warningCodes, la aplicación los deja intactos:

Página Esquema de confirmación resultante de JSON aplanado

Exenciones de aplanamiento

El parámetro Exenciones de aplanamiento le permite especificar uno o más nombres de elementos JSON que se deben dejar como un solo elemento de cadena en lugar de dividirse en campos separados, por ejemplo, un objeto JSON que representa una matriz o un objeto que contiene otros elementos. Considere el siguiente JSON de muestra:

[{
  "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
  }
}]

Cuando se marca el parámetro Aplanar y se especifica un valor en Exenciones de aplanamiento de geometry, el JSON de muestra anterior se trata como se ilustra a continuación. En el campo last_known_position_geometry, el objeto JSON no se ha dividido por aplanamiento. Esto se debe a que el elemento JSON original de geometry se especificó en el parámetro Exenciones de aplanamiento. Esto resulta útil cuando desea conservar objetos JSON. Este suele ser el caso cuando el objeto de geometría representa la ubicación espacial de las entidades. En este caso, este atributo tiene el formato de geometría GeoJSON.

[{
  "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
}]

El esquema se utiliza como se ilustra a continuación y la información de ubicación del feed o la fuente de datos se puede configurar para que se derive a partir de un único campo.

Página Esquema de confirmación resultante de JSON aplanado con campo de geometría excluido del aplanamiento

Aplanar matrices

El parámetro Aplanar matrices determina si las matrices se aplanan en campos separados. Los campos nuevos se nombran agregando al valor arrayName un guion bajo y el número del objeto de matriz. Si la matriz es una matriz de objetos, el nombre del campo también agrega un guion bajo y el nombre asociado al valor. Al aplanar matrices de objetos, el JSON se puede anidar con varios niveles de profundidad. Los nuevos nombres de campo aplanados agregan nombres de objetos con un guion bajo hasta llegar al objeto más profundo.

Por ejemplo, el siguiente JSON de muestra presenta el objeto de matriz cargoInformation.

{
    "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"
}

Cuando se marca el parámetro Aplanar matrices, el JSON de muestra anterior se procesa de la siguiente manera, en la que los elementos de los objetos de información de carga se dividen en los campos correspondientes:

{
    "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"
}

El esquema se utiliza como se ilustra a continuación. Si bien la interfaz de usuario corta los nombres del campo cargoInformation, la aplicación los deja intactos:

Aplanamiento de matriz de formato JSON

Exenciones de aplanamiento de matrices

El parámetro Exenciones de aplanamiento de matrices le permite especificar uno o más nombres de matrices JSON que se deben dejar como un solo elemento de cadena en lugar de dividirse en campos separados. Considere el siguiente JSON de muestra:

{
    "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"
}

Si el parámetro Aplanar matrices está marcado y se especifica un valor en Exenciones de aplanamiento de matrices de sensorValues, el JSON de muestra anterior se trata como se ilustra a continuación. En la matriz sensorValues, el objeto de la matriz no se divide por aplanamiento y se deja como una cadena. Para indicar que varias matrices deben estar exentas de aplanamiento, sepárelas con comas en el parámetro Exenciones de aplanamiento de matrices.

{
    "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"
}

El esquema se utiliza como se ilustra a continuación.

Exenciones de aplanamiento de matrices JSON

Consideraciones y limitaciones

Cuando trabaje con datos en formato JSON en Velocity, tenga en cuenta la información y las limitaciones que se describen a continuación.

Datos JSON que contienen matrices

Las matrices ofrecen flexibilidad en JSON; sin embargo, suponen un reto al construir entidades de ArcGIS a partir de datos JSON debido a su longitud indeterminada. Si todo el documento o un nodo raíz definido es una matriz de objetos, cada objeto se tratan como una entidad separada. Las matrices en el objeto JSON se derivan como cadenas. Puede realizar un procesamiento posterior en las cadenas utilizando herramientas analíticas.

Valores de datos nulos

En formato JSON, los datos se representan con pares de nombre y valor. Si un valor es nulo, numerosas aplicaciones que crean datos en formato JSON omiten el nombre del objeto.

Esto tiene consecuencias cuando se configura o edita por primera vez un feed o una fuente de datos. Velocity muestrea el flujo de datos o los archivos para determinar el formato y el esquema de los datos. Si a todas las muestras devueltas en el proceso de muestreo les faltan elementos JSON porque esas muestras tienen valores nulos, esos campos se omiten del esquema de datos del feed o la fuente.

Por consiguiente, los mensajes que hayan llegado en un momento posterior que tuviesen valores de datos para esos elementos JSON no se pueden analizar en observaciones o registros que se puedan procesar mediante feeds o análisis en Velocity.

Tipos de campos derivados

Los datos JSON genéricos no están fuertemente tipados, por lo que podría ser necesario corregir los tipos de campo derivados de las muestras. Cambiar los tipos de campo debe hacerse con cuidado. Una práctica recomendada es hacer que un tipo de campo sea más inclusivo, no menos. Por ejemplo, es posible que un conjunto de muestras pequeño no revele que un valor de campo determinado debe ser Float64 en lugar de Float32.

Además, no se recomienda cambiar los campos de un tipo flotante (Float64 o Float32) a un tipo entero (Int64 o Int32). Tampoco se recomienda cambiar los tipos de campo para convertir valores numéricos sobre la marcha. Para los datos JSON, degradar un valor flotante a un número entero hace que la parte decimal del valor se omita sin redondearla. Para convertir o transformar valores numéricos, utilice Calcular campo o Correlacionar campos.

Tamaño del archivo JSON

Como práctica recomendada, mantenga los archivos JSON en Velocity por debajo de los 100 MB por archivo. Si tiene una cantidad de datos mayor, divida los archivos para que cada uno de ellos tenga un tamaño inferior a los 100 MB.