首页 > 解决方案 > How to push objects with different JSON structure from an http request?

问题描述

I'm doing an http request and as result I'm having a JSON like this:

{
  '$': {
    'xmlns:pico': 'http://purl.org/pico/1.0/',
    'xmlns:dc': 'http://purl.org/dc/elements/1.1/',
    'xmlns:dcterms': 'http://purl.org/dc/terms/',
    'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
    'xsi:schemaLocation': 'http://purl.org/pico/1.0/    http://purl.org/pico/1.0/pico.xsd'
  },
  'dc:description': {
    _: 'L’antica porta urbica, incorporata negli edifici circostanti, fu ridotta a un solo fornice. Sul lato interno, Madonna col Bambino e santi, affresco del sec. XIV.',
    '$': { 'xml:lang': 'it' }
  },
  'dc:identifier': '57926',
  'dc:subject': {
    _: 'http://culturaitalia.it/pico/thesaurus/4.0#mura_fortificazioni',
    '$': { 'xsi:type': 'pico:Thesaurus' }
  },
  'dc:title': { _: 'Arco delle due Porte, Siena', '$': { 'xml:lang': 'it' } },
  'dc:type': { _: 'PhysicalObject', '$': { 'xsi:type': 'dcterms:DCMIType' } },
  'dcterms:isReferencedBy': {
    _: 'http://www.touringclub.com/monumento/toscana/siena/arco-delle-due-porte.aspx',
    '$': { 'xsi:type': 'dcterms:URI' }
  },
  'dcterms:spatial': {
    _: 'PlaceName=via Stalloreggi ; city=Siena ; province=SI',
    '$': { 'xsi:type': 'pico:PostalAddress' }
  }
}

I'm interested to push only the dc:description so I made this (snapshot from my script):


  for await (const item of identifierIterator) {

        try {
            //console.log((item.metadata["pico:record"]["dc:description"]["_"]));
            const meta = item.metadata["pico:record"]["dc:description"]["_"];
            if (meta.length >= 10 && meta.length <= 400 && oav.some(o => meta.includes(o))) {
                console.log(meta);
                const id = [item.metadata["pico:record"]["dc:identifier"]]

                addedData.push(Object.assign({}, item.metadata["pico:record"]["dc:description"], id, results));

            } else {
                console.log(meta);
                const ID = [item.metadata["pico:record"]["dc:identifier"]]

                skippedData.push(Object.assign({}, item.metadata["pico:record"]["dc:description"], ID, result));
            }
        } catch (err) {
            //console.log(item.metadata["pico:record"])
        }

        //break;
    };

It works and I'm having the expected output.

However, sometimes, the objects I'm getting from the http request have a different JSON structure like this:

{
  '$': {
    'xmlns:pico': 'http://purl.org/pico/1.0/',
    'xmlns:dc': 'http://purl.org/dc/elements/1.1/',
    'xmlns:dcterms': 'http://purl.org/dc/terms/',
    'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
    'xsi:schemaLocation': 'http://purl.org/pico/1.0/    http://purl.org/pico/1.0/pico.xsd'
  },
  'dc:description': [
    {
      _: "Austero e a pianta trapezoidale, fu fondato alla fine del sec. xi da Riccardo Siniscalco, fratello di Roberto il Guiscardo, ampliato da re Ruggero, rimaneggiato e abbellito da Federico II nel 1230, di ritorno dalla 6ª crociata. Ha due imponenti torri alle estremità della facciata sud, alte circa il doppio delle cortine, che misurano circa m 12, abbastanza simili per fattura ma non coeve. Le mura sono rivestite di grosse bugne di carparo rosso, tagliate e disposte con sapiente effetto decorativo, specie nell'incorniciare i portali e le finestre. Queste sono varie di forma, di misura e di disposizione: notevoli, nella facciata meridionale, a sin., la bifora architravata (con 2 lunette ogivali intagliate nell'architrave) e, sulla facciata della torre d. (SE), un rosone decorato a raggi e archetti di reminiscenza araba. Sopra gli ingressi a O e S sono due piombatoi. L'edificio fu restaurato nel 1909 e ancora nel 1969-1974.",
      '$': [Object]
    },
    'name=Classificazione secondo la graduatoria Guida Rossa TCI; value=*'
  ],
  'dc:identifier': '47005',
  'dc:subject': [
    {
      _: 'http://culturaitalia.it/pico/thesaurus/4.0#edifici_strutture_di_difesa',
      '$': [Object]
    },
    {
      _: 'http://culturaitalia.it/pico/thesaurus/4.0#mura_fortificazioni',
      '$': [Object]
    }
  ],
  'dc:title': { _: 'Castello, Gioia del Colle', '$': { 'xml:lang': 'it' } },
  'dc:type': { _: 'PhysicalObject', '$': { 'xsi:type': 'dcterms:DCMIType' } },
  'dcterms:isReferencedBy': {
    _: 'http://www.touringclub.com/monumento/puglia/bari/castello_41.aspx',
    '$': { 'xsi:type': 'dcterms:URI' }
  },
  'dcterms:spatial': {
    _: 'PlaceName=piazza dei Martiri 1 ; city=Gioia del Colle ; province=BA',
    '$': { 'xsi:type': 'pico:PostalAddress' }
  }
}

As you can see the dc:description has a nested object.


 'dc:description': [
    {
      _: "Austero e a pianta trapezoidale, fu fondato alla fine del sec. xi da Riccardo Siniscalco, fratello di Roberto il Guiscardo, ampliato da re Ruggero, rimaneggiato e abbellito da Federico II nel 1230, di ritorno dalla 6ª crociata. Ha due imponenti torri alle estremità della facciata sud, alte circa il doppio delle cortine, che misurano circa m 12, abbastanza simili per fattura ma non coeve. Le mura sono rivestite di grosse bugne di carparo rosso, tagliate e disposte con sapiente effetto decorativo, specie nell'incorniciare i portali e le finestre. Queste sono varie di forma, di misura e di disposizione: notevoli, nella facciata meridionale, a sin., la bifora architravata (con 2 lunette ogivali intagliate nell'architrave) e, sulla facciata della torre d. (SE), un rosone decorato a raggi e archetti di reminiscenza araba. Sopra gli ingressi a O e S sono due piombatoi. L'edificio fu restaurato nel 1909 e ancora nel 1969-1974.",
      '$': [Object]
    },
    'name=Classificazione secondo la graduatoria Guida Rossa TCI; value=*'
  ],

So, the object is not pushed.

How can I fix this issue and push the dc:description from both JSON structure?

Thanks

标签: javascriptjson

解决方案


从这条线...

const meta = item.metadata["pico:record"]["dc:description"]

你会得到

{
_: 'L’antica porta urbica, incorporata negli edifici circostanti, fu ridotta a un solo fornice. Sul lato interno, Madonna col Bambino e santi, affresco del sec. XIV.',
'$': { 'xml:lang': 'it' }
}

或者

[
  {
    _: "Austero e a pianta trapezoidale, ...",
    '$': [Object]
  },
  'name=Classificazione secondo la graduatoria Guida Rossa TCI; value=*'
]

如果您将第一个结果传递给Array.isArray(meta)它将返回false. 它将返回true第二个块。

所以现在你可以决定如何处理你的数据,即

if (Array.isArray(meta)) {
  // pass the data to an array method
} else {
  // pass the data to an object method
}

然后您拥有的数组具有混合数据类型,因此您可能希望将每个元素传递给typeof之后以确定逻辑中的下一个分支。


推荐阅读