树形json数据的解析

关于树形结构的数据,在工作的项目中用的还是比较多的。从服务器上获取到的数据往往都是json格式的,这个时候就需要我们去对json数据进行解析。

树形结构介绍。

如何解析json数据

关于json数据的解析,我们为什么要进行json数据的解析的,因为在java中或者其他的语言中,从服务器拿到的数据是json的字符串。我们不能通过这个String来获取对我们有用的数据。

在项目中,往往采用 FastJson 或者 Gson 解析。

  • FastJson

都是我平时在网页上粘贴的。反正解析就是服务器下来是对象我就用对象去装数据,是数组我就用数组去装。

下面是一个比较复杂的树形结构。之所以说复杂,是因为各节点的类型不一样。

在以往,一个树形结构的数据都是一个类型表示的。

而这次。。。。真的很头痛。

"code": 200,     "data": [             "companyId": "2",             "companyName": "公司名",             "parentId": "0",             "children": [                     "companyId": "1",                     "companyName": "公司名1",                     "parentId": "2",                     "children": [                         "departmentId": "1",                         "companyId": "1",                         "departmentName": "部门",                         "parentId": null,                         "children": [                                 "postId": "35",                                 "postName": "职位",                                 "children": [                                         "employeeId": "8",                                         "employeeName": "小菜鸟",                                         "companyId": "1",                                         "companyName": "公司名",                                         "departmentId": "1",                                         "departmentName": "部门",                                         "postId": "35",                                         "postName": "职位"     "success": true

当然,我删去了一部分没有用的数据。我们只关心date里面的数据。这就是后台返回给我的树形数据。开始一看,这数据并没有不妥,可是每个children的数据结构不一样啊,让我平时用惯了cv大法的人,怎么处理呢。

处理方式1

把所有的children数据合在一个类里面,

合并后的数据。一个9个属性,看来还可以,属性不多。

呵呵,如果我们的层级达到20层,每一层至少有10个不同的属性,还不算共同的属性,那就有20*10=200个属性,你光定义一个属性就200行代码。

这个方法我觉得不行。

"companyId":"1",             "companyName":"公司名",             "parentId":null,             "departmentId":"1",             "departmentName":"部门",             "postId":"35",             "postName":"职位",             "employeeId":"8",             "employeeName":"小菜鸟"

处理方式2

children里的数据用HashMap去装,这个时候,只要是这样的数据,我就不考虑类型,只管用递归去遍历就行了。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //表示的一个json
String json = "{}";
        Structure structure = JSON.parseObject(json, Structure.class);
        List<HashMap<String, Object>> datas = structure.getData();
        for (int i = 0; i < datas.size(); i++) {
            HashMap<String, Object> childData = datas.get(i);
        List<HashMap<String, Object>> data = getFromListBean(datas);
    List<HashMap<String, Object>> mDatas2 = new ArrayList<>();
    //返回所有的节点    private  List<HashMap<String, Object>> getFromListBean(List<HashMap<String, Object>> list) {
        List<HashMap<String, Object>> temp = new ArrayList<>();
        for(HashMap<String, Object> mBean :list){
            mDatas2.add(mBean);
            if(mBean.get("children")!=null){
                temp=new ArrayList<>();
                List<HashMap> children= JSON.parseArray(mBean.get("children").toString(),
                        HashMap.class);
                for(HashMap<String, Object> nBean:children){
                    temp.add(nBean);
                getFromListBean(temp);
        return mDatas2;
 

遇到的坑:我用的是fastjson解析的,需要使用

compile 'com.alibaba:fastjson:1.2.58'

需要用1.2.58及以上的包,现在最高就是这个。这样就把这个通过递归解析出来了。数据是解析出啦了,但是怎么展示呢?怎么取值呢。又是一个比较头疼的问题。我也正在思考这个问题。这几天也没有想到一个更好的办法,我的思路是,后台给我每个等级的节点定义一个type。我根据type去取值就是了,知道type就知道map里的key,就能取到对应的value啦。

你有更好的思路,我们可以交流下哦。

扫码关注哦。

分享是对我最大的支持。

树形json数据的解析关于树形结构的数据,在工作的项目中用的还是比较多的。从服务器上获取到的数据往往都是json格式的,这个时候就需要我们去对json数据进行解析。树形结构介绍。如何解析j... 略有修改,User-Agent为需求字段 解析json字符串可以像解析DOM一样,解析一个节点。Gson的jar包中提供了JsonParser类,专门用于解析json字符串的,注意只是json节点的内容解析出来,并不像前两节把整个json字符串反序列化为一个对象。 public class Demo { public static void main(String[] args
JSON to Java Tree Model Example Jackson提供了一个TreeNode类: com.fasterxml.jackson.databind.JsonNode。ObjectMapper提供了一个方法将JSON转换为一个JsonNode作为根节点的TreeNode。这和DOM 节点在XML DMO树中比较相似。下面的栗子展示了从JSON字符串构建一棵树的过程; pub...
json_parser: read_json(filename, ptree):用于将filename文件中的内容读入ptree结构中。 write_json(filename, ptree):用于将ptree结构中的内容写入filename中。 basic_ptree: sel... 版本兼容性问题,需要对树形结构的数据的某一属性值特殊处理,想到了两种处理方式,一种递归解析设置,另一种replaceAll正则匹配替换,最终还是选择使用replaceAll,原来replaceAll这么好用。。 1.数据结构Topology如下 package entity; import com.alibaba.fastjson.annotation.JSONField; import lombok.AllArgsConstructor; import lombok.Data; TreeNode node1 = new TreeNode("node1"); TreeNode node2 = new TreeNode("node2"); TreeNode node3 = new TreeNode("node3"); // 将子节点添加到根节点的 children 中 root.addChild(node1); root.addChild(node2); root.addChild(node3); // 创建孙子节点 TreeNode node4 = new TreeNode("node4"); TreeNode node5 = new TreeNode("node5"); TreeNode node6 = new TreeNode("node6"); // 将孙子节点添加到第一个子节点的 children 中 node1.addChild(node4); node1.addChild(node5); node1.addChild(node6); // 使用 Jackson 库将树形结构转换为 JSON 字符串 ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(root); System.out.println(json); 在这个代码中,我们定义了一个 TreeNode 类表示树节点,其中包含了节点名称和子节点的列表。然后我们使用递归的方法来构建树形结构,并使用 Jackson 库将其转换为 JSON 字符串。 运行这个代码后,你将得到一个类似于下面的输出: ```json