解析JavaScript中的特定Json

时间:2019-02-20 14:04:45

标签: javascript json xml

我正在努力解析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>

2 个答案:

答案 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 = { "<": "&lt;", ">": "&gt;", "&": "&amp;", "'": "&apos", '"': "&quot;" };
    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 = { "<": "&lt;", ">": "&gt;", "&": "&amp;", "'": "&apos", '"': "&quot;" };
    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>级别。