Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在节点中使用TypeScript在不同级别解析键控/值嵌套JSON_Node.js_Json_Typescript_Parsing - Fatal编程技术网

Node.js 在节点中使用TypeScript在不同级别解析键控/值嵌套JSON

Node.js 在节点中使用TypeScript在不同级别解析键控/值嵌套JSON,node.js,json,typescript,parsing,Node.js,Json,Typescript,Parsing,我得到了一些数据,我必须在不同的层次上解析它们,以获取它们,并以格式化的方式保持类似的结构。我在当前项目中使用的节点环境(谷歌云)中使用TypeScript。我对这种语言和环境很陌生,我对语言特性方面的指导很反感,而不是数据处理部分 我输入的数据是XML格式的,如下所示: <item> <key xsi:type="xsd:string">intermedite_key</key> <value xsi:type=&q

我得到了一些数据,我必须在不同的层次上解析它们,以获取它们,并以格式化的方式保持类似的结构。我在当前项目中使用的节点环境(谷歌云)中使用TypeScript。我对这种语言和环境很陌生,我对语言特性方面的指导很反感,而不是数据处理部分

我输入的数据是XML格式的,如下所示:

<item>
    <key xsi:type="xsd:string">intermedite_key</key>
    <value xsi:type="ns2:Map">
        <item>
            <key xsi:type="xsd:string">Key_parse_first_level_1</key>
            <value xsi:type="ns2:Map">
                <item>
                    <key xsi:type="xsd:string">intermedite_key</key>
                    <value xsi:type="ns2:Map">
                        <item>
                            <key xsi:type="xsd:string">Key_parse_second_level_1</key>
                            <value xsi:type="ns2:Map">
                                <item>
                                    <key xsi:type="xsd:int">intermedite_key</key>
                                    <value xsi:type="ns2:Map">
                                        <item>
                                            <key xsi:type="xsd:string">Key_1</key>
                                            <value xsi:type="xsd:string">DataToParse</value>
                                        </item>
                                        <item>
                                            <key xsi:type="xsd:string">Key_2</key>
                                            <value xsi:type="xsd:string">DataToParse</value>
                                        </item>
                                    </value>
                                </item>
                            </value>
                        </item>
                        <item>
                            <key xsi:type="xsd:string">Key_parse_second_level_2</key>
                            <value xsi:type="ns2:Map">
                                <item>
                                    <key xsi:type="xsd:int">intermedite_key</key>
                                    <value xsi:type="ns2:Map">
                                        <item>
                                            <key xsi:type="xsd:string">Key_parse_third_level_1</key>
                                            <value xsi:type="xsd:string">DataToFetch</value>
                                        </item>
                                        <item>
                                            <key xsi:type="xsd:string">Key_parse_third_level_2</key>
                                            <value xsi:type="xsd:string">DataToFetch</value>
                                        </item>
                                        </item>
                                    </value>
                                </item>
                            </value>
                        </item>
                    </value>
                </item>
            </value>
        </item>
        <item>
            <key xsi:type="xsd:string">Key_parse_first_level_2>
            <value xsi:type="ns2:Map">
                <item>
                    <key xsi:type="xsd:string">intermedite_key</key>
                    <value xsi:type="ns2:Map">
                        <item>
                            <key xsi:type="xsd:string">Key_parse_second_level_1</key>
                            <value xsi:type="ns2:Map">
                                <item>
                                    <key xsi:type="xsd:int">intermedite_key</key>
                                    <value xsi:type="ns2:Map">
                                        <item>
                                            <key xsi:type="xsd:string">Key_parse_third_level_1</key>
                                            <value xsi:type="xsd:string">DataToFetch</value>
                                        </item>
                                        <item>
                                            <key xsi:type="xsd:string">Key_parse_third_level_2</key>
                                            <value xsi:type="xsd:string">DataToFetch</value>
                                        </item>
                                    </value>
                                </item>
                            </value>
                        </item>
                    </value>
                </item>
            </value>
        </item>
        <item>
        
        ... Other items
        
        </item>
    </value>
</item>
这些是按键解析第二级1的控制台输出:

value - 0,[object Object] 

value - 1,[object Object] 
对于键解析第二级第2级:

value - value,[object Object] 

似乎Key_parse_second_level_1的值与Key_parse_second_level_2没有“对齐”,当我深入研究时,我没有得到键和值的预期结果。因此,我有不同的问题,在这种情况下使用对象类是一个好主意吗(我被引诱将它们用于键和条目方法)?使用数组类会更好吗?

我这样做解决了我的问题:

const SecondLevel = Object.entries(FisrtLevelValues.value.item.value.item)

Object.keys(SecondLevel).forEach((SecondLevelKeys: any) => {

    let SecondLevelValues: any;
          
          if(String(SecondLevelKeys).match("value")){
  
            return;
  
          } else if (String(SecondLevelKeys).match("key")){
 
            SecondLevelValues = SecondLevel['value']['item']['value']['item'];
  
          } else if (String(SecondLevelKeys).match(/[0-9]/)) {
          

            SecondLevelValues = SecondLevel[SecondLevelKeys]['value']['item']['value']['item'];

          }

          Object.keys(SecondLevelValues).forEach((ThirdLevelKeys) => {
            
            const getKey = SecondLevelValues[ThirdLevelKeys]['key'];
            const getValues = SecondLevelValues[ThirdLevelKeys]['value'];

            ...

          });
    
});
在第二级,if用于过滤掉“value”键,因为Object.key()给出了两个结果,“value”和“key”(这是我唯一需要的原因)。最后一个else if按数字筛选键,因为当有多个项对象时。key()将数字作为项索引

以防对某人有所帮助

const SecondLevel = Object.entries(FisrtLevelValues.value.item.value.item)

Object.keys(SecondLevel).forEach((SecondLevelKeys: any) => {

    let SecondLevelValues: any;
          
          if(String(SecondLevelKeys).match("value")){
  
            return;
  
          } else if (String(SecondLevelKeys).match("key")){
 
            SecondLevelValues = SecondLevel['value']['item']['value']['item'];
  
          } else if (String(SecondLevelKeys).match(/[0-9]/)) {
          

            SecondLevelValues = SecondLevel[SecondLevelKeys]['value']['item']['value']['item'];

          }

          Object.keys(SecondLevelValues).forEach((ThirdLevelKeys) => {
            
            const getKey = SecondLevelValues[ThirdLevelKeys]['key'];
            const getValues = SecondLevelValues[ThirdLevelKeys]['value'];

            ...

          });
    
});