App per la logica di Azure: verifica dell'esistenza di una proprietà in un oggetto JSON

Aug 22 2020

Ho un JSON proveniente da un'azione "SQLServer GetRecords (V2)" come la seguente. Sfortunatamente, la risposta non conterrà campi con valori nulli. Nel mio esempio, il campo "Nome" è nullo per alcuni elementi.

[
  {
    "@odata.etag": "",
    "ItemInternalId": "378fd3bc-0cd4-4171-8e7d-462461086580",
    "RowID": 1,
    "Name": "1234"
  },
  {
    "@odata.etag": "",
    "ItemInternalId": "378fd3bc-0cd4-4171-8e7d-462461086580",
    "RowID": 1
  }, ...
}

Voglio iterare questi elementi e passare ogni elemento a un altro endpoint HTTP.

Quando utilizzo item () ['Name'] o item ()? ['Name'] per accedere al campo del nome, fallirà per il secondo elemento che dice

L'espressione del linguaggio del modello non può essere valutata perché la proprietà "Nome" non esiste, le proprietà disponibili sono ...

Vedo molte persone che usano la funzione xpath combinata con la funzione xml per recuperare il valore.

https://docs.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference

Ma quando uso alcuni pensieri come xpath (xml (item ()), '/ Name') , verrà generato un errore che dice

Il parametro "xml" della funzione del linguaggio del modello non è valido. Il valore fornito non può essere convertito in XML: "L'oggetto radice JSON ha la proprietà" @ odata.etag "che verrà convertita in un attributo. Un oggetto radice non può avere proprietà di attributo. Valuta la possibilità di specificare un DeserializeRootElementName. Percorso "[" @ odata.etag "]". ". Perfavore guardahttps://aka.ms/logicexpressions#xml per i dettagli sull'utilizzo.

Aggiorna 1

L'ho capito lavorando con la seguente espressione, davvero non mi piace

first(xpath(xml(addProperty(json('{}'), 'obj', item())), '//obj/Name[1]/text()'))

C'è un altro modo semplice per risolvere il mio problema. Grazie in anticipo

Risposte

1 HuryShen Aug 25 2020 at 12:48

Per questo problema, sembra che tu ottenga il valore " Name " nel ciclo " For each " dalla risposta di " SQLServer GetRecords (V2) " direttamente. Possiamo semplicemente usare un'azione " Parse JSON " per risolvere facilmente questo problema. Fare riferimento alla mia app per la logica di seguito:

1. Inizializzo una variabile per memorizzare gli stessi dati json dei tuoi per simulare la risposta da " SQLServer GetRecords (V2) ".

2. Quindi aggiungere l'azione " Parse JSON " per analizzare jsondata. Possiamo fare clic sul pulsante " Usa payload di esempio per generare lo schema " e copiare jsondata al suo interno. Genererà automaticamente lo schema. Lo schema mostrato come di seguito ( nota : lo schema specifica se questi campi sono obbligatori nella required proprietà ).

{
    "items": {
        "properties": {
            "@@odata.etag": {
                "type": "string"
            },
            "ItemInternalId": {
                "type": "string"
            },
            "Name": {
                "type": "string"
            },
            "RowID": {
                "type": "integer"
            }
        },
        "required": [
            "@@odata.etag",
            "ItemInternalId",
            "RowID"
        ],
        "type": "object"
    },
    "type": "array"
}

3. Ora usa " For each " per eseguire il loop bodyda " Parse JSON " e imposta la casella " Value " con la Nameproprietà da " Parse JSON ".

4. Eseguire l'app per la logica, funziona correttamente senza alcun messaggio di errore.

2 JasonNam Aug 22 2020 at 00:35

Se lavori con JSON:

item()?['Name']