如何解析字段名称不确定的json字符串

Posted 寻觅beyond

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解析字段名称不确定的json字符串相关的知识,希望对你有一定的参考价值。

问题如下

  下面是一个json字符串,有其他系统提交过来的,当前需要对该json字符串进行解析,需要注意的是,外层的key是不确定的(随机的字符串),但是内层的value字段名称和类型都可以确定。

{
    "fa490c67-bdb2-4ddd-810d-894e9ceeba0e":{
        "top":191,
        "left":55,
        "process_to":[
            "bd7c788d-9d2f-48da-80ad-726edb8dffb1"
        ]
    },
    "bd7c788d-9d2f-48da-80ad-726edb8dffb1":{
        "top":171,
        "left":281,
        "process_to":[

        ]
    }
}

  

解析方案

package cn.ganlixin.test;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import org.junit.Test;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class JsonUtilsTest {

    @Test
    public void test() throws JsonProcessingException {
        String s = "{"fa490c67-bdb2-4ddd-810d-894e9ceeba0e":{"top":191,"left":55,"process_to":["bd7c788d-9d2f-48da-80ad-726edb8dffb1"]},"bd7c788d-9d2f-48da-80ad-726edb8dffb1":{"top":171,"left":281,"process_to":[]}}";

        ObjectMapper objectMapper = new ObjectMapper();
        final JsonNode jsonNode = objectMapper.readTree(s);

        // 进行迭代
        final Iterator<Map.Entry<String, JsonNode>> fields = jsonNode.fields();
        fields.forEachRemaining(item -> {
            MyOutEntity myOutEntity = new MyOutEntity();
            myOutEntity.setKey(item.getKey());
            try {
                MyInnerEntity myInnerEntity = objectMapper.readValue(item.getValue().toString(), MyInnerEntity.class);
                myOutEntity.setMyInnerEntity(myInnerEntity);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }

            // 打印解析完的一个对象
            System.out.println(myOutEntity);
        });
        
        // JsonUtilsTest.MyOutEntity(key=fa490c67-bdb2-4ddd-810d-894e9ceeba0e, myInnerEntity=JsonUtilsTest.MyInnerEntity(top=191, left=55, process_to=[bd7c788d-9d2f-48da-80ad-726edb8dffb1]))
        //JsonUtilsTest.MyOutEntity(key=bd7c788d-9d2f-48da-80ad-726edb8dffb1, myInnerEntity=JsonUtilsTest.MyInnerEntity(top=171, left=281, process_to=[]))
    }

    @Data
    private static class MyOutEntity {
        private String key;
        private MyInnerEntity myInnerEntity;
    }

    @Data
    private static class MyInnerEntity {
        private Integer top;
        private Integer left;
        private List<String> process_to;
    }
}

  

  

以上是关于如何解析字段名称不确定的json字符串的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs GraphQL 片段解析器

Golang实践录:反射reflect的一些研究及代码汇总

java多种方式解析json字符串

我如何使用 codeanywhere 片段

避免在 Spark 中解析 json 子字段

Spark - 如何将 JSON 转义的字符串字段解析为 DataFrames 中的 JSON 对象?