【问题标题】:Parsing keyed/valued nested JSON at different levels using TypeScript in Node在 Node 中使用 TypeScript 解析不同级别的键值/值嵌套 JSON
【发布时间】:2021-01-03 16:40:36
【问题描述】:

我得到了一些数据,我必须在不同级别解析这些数据以获取它并在其格式中保持相似的结构。我在用于当前项目的 Node 环境(Google Cloud)中使用 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>

我已经设法编写了这段代码,它可以解析第一级但在第二级:

/*Converts the XMl into a an object with 'fast-xml-parser'*/
const getRawResponseJSON = parser.parse(XMLDataToConvert);

const FisrtLevel = getRawResponseJSON['item']['value']['item']

Object(FisrtLevel).forEach((FisrtLevelValues: any) => {

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

  SecondLevel.forEach((SecondLevelValues: any) => {

    console.log("value - " + SecondLevelValues);
    
    });
    
});

这些是 Key_parse_second_level_1 的控制台输出:

value - 0,[object Object] 

value - 1,[object Object] 

对于 Key_parse_second_level_2:

value - value,[object Object] 

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

【问题讨论】:

    标签: node.js json typescript parsing


    【解决方案1】:

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

    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'];
    
                ...
    
              });
        
    });
    

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

    万一它对某人有帮助。

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2018-11-02
      • 2015-08-16
      • 2020-11-14
      • 1970-01-01
      相关资源
      最近更新 更多