我正在努力解析Json以实现所需的需求。
我正在从GraphQL调用中提取数据,并且需要解析响应,然后生成一个XML文件。
JSON Resonse示例:
studentdob = studentview
我需要对此进行解析,并制作一个如下的xml文件:
{
"data": {
"products": {
"results": [{
"masterData": {
"current": {
"name": "Paragon Pen",
"description": "TEST",
"categories": [{
"name": "Writing Instrument"
}]
}
}
}]
}
}
}
我无法解析然后保留父元素。 例如,我要制作xml标签,然后在此标签内添加“名称”元素(书写工具)。任何帮助表示赞赏。
到目前为止,我的Parse方法。 :
<?xml version="1.0"?><product><name>Paragon Pen</name><description>TEST</description><category>Writing Instrument</category></product>
答案 0 :(得分:0)
为什么要解析整个对象?
您应该能够遍历整个数组并发出事件
data.products.results.forEach(result, index => eventEmitter.emit('writeToXML',index,result))
尽管如此,示例xml仅支持一种产品,对吗?这样每个发射器都会创建自己的xml文件?
答案 1 :(得分:0)
您可以将名称作为附加参数传递给递归函数。
以下是使用普通JavaScript构建XML字符串的方法:
function encodeXML(s) { // Utility to escape reserved characters in XML data
const map = { "<": "<", ">": ">", "&": "&", "'": "&apos", '"': """ };
return String(s).replace(/[<>&'"]/g, m => map[m]);
}
function extractJSON(name, val) {
const content = Array.isArray(val) ? val.map( elem => extractJSON("item", elem) ).join``
: Object(val) === val ? Object.keys(val).map(key => extractJSON(key, val[key]) ).join``
: encodeXML(val);
return `<${name}>${content}</${name}>`;
}
// Example:
var obj = {"data":{"products":{"results":[{"masterData":{"current":{"name":"Paragon Pen","description":"TEST","categories":[{"name":"Writing Instrument"}]}}}]}}};
console.log(extractJSON("data", obj.data));
请注意,对于数组,这不会创建数字子标签(<0>
,<1>
),而是创建硬编码的<item>
标签,每个数组元素一个。
如果只需要深度嵌套的部分(如所需的输出),则只需传递对该嵌套对象的引用即可:
function encodeXML(s) { // Utility to escape reserved characters in XML data
const map = { "<": "<", ">": ">", "&": "&", "'": "&apos", '"': """ };
return String(s).replace(/[<>&'"]/g, m => map[m]);
}
function extractJSON(name, val) {
const content = Array.isArray(val) ? val.map( elem => extractJSON("item", elem) ).join``
: Object(val) === val ? Object.keys(val).map(key => extractJSON(key, val[key]) ).join``
: encodeXML(val);
return `<${name}>${content}</${name}>`;
}
// Example:
var obj = {"data":{"products":{"results":[{"masterData":{"current":{"name":"Paragon Pen","description":"TEST","categories":[{"name":"Writing Instrument"}]}}}]}}};
console.log(extractJSON("product", obj.data.products.results[0].masterData.current));
请注意,categories
数组将被真正地对待,因此您仍然可以在其中获得<item>
级别。