树形json数据的解析
关于树形结构的数据,在工作的项目中用的还是比较多的。从服务器上获取到的数据往往都是json格式的,这个时候就需要我们去对json数据进行解析。
树形结构介绍。
如何解析json数据
关于json数据的解析,我们为什么要进行json数据的解析的,因为在java中或者其他的语言中,从服务器拿到的数据是json的字符串。我们不能通过这个String来获取对我们有用的数据。
在项目中,往往采用
FastJson
或者
Gson
解析。
都是我平时在网页上粘贴的。反正解析就是服务器下来是对象我就用对象去装数据,是数组我就用数组去装。
下面是一个比较复杂的树形结构。之所以说复杂,是因为各节点的类型不一样。
在以往,一个树形结构的数据都是一个类型表示的。
而这次。。。。真的很头痛。
"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