javascript - 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
解决方案
从这条线...
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
之后以确定逻辑中的下一个分支。
推荐阅读
- java - 使用Jackson反序列化JSON实体的动态属性
- r - 为 R 中的 data.frame 中的每个“id”单独但唯一地创建一个变量
- reactjs - 打字稿三元表达式错误说条件将始终返回“假”
- ios - 在标签栏控制器中嵌入“显示”序列
- google-analytics - 向 Google Analytics 发送虚拟页面视图时动态设置页面值
- math - 归一化向量函数返回意外结果
- html - CSS:带有弯曲边缘和居中文本(水平和垂直居中)
- c - 如何知道重新分配后字符串指针是否真的变小了?
- c++ - constexpr 值作为指针类型的非类型模板参数
- angular - Ag-grid 自定义工具提示组件模板未显示