1. 树模型准备JSON文档的内存树表示。它构建了一个JsonObject节点树。它是一种灵活的方法, 类似于XML的DOM解析器。

2. 从JSON创建树

2.1. 在读取JSON之后, JsonParser提供指向树的根节点的指针。根节点可用于遍历完整的树。请考虑以下代码段以获取提供的JSON字符串的根节点。

JsonParser parser = new JsonParser();
String jsonString = "{\"name\":\"张三\", \"age\":21,\"isMale\":false,\"marks\": [100,90,85]}";
JsonElement rootNode = parser.parse(jsonString);

3. 遍历树模型

3.1. 在遍历树并处理数据时, 使用到根节点的相对路径获取每个节点。以下代码段显示了如何遍历树。

JsonObject details = rootNode.getAsJsonObject();JsonElement nameNode = details.get("name");
System.out.println("name: " +nameNode.getAsString());JsonElement ageNode = details.get("age");
System.out.println("age: " + ageNode.getAsInt());

4. 例子

4.1. 新建一个名为GsonStream的Java项目, 同时添加相关jar包。

4.2. 新建student.java

package com.fj.t;import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;public class Student implements Serializable {private static final long serialVersionUID = 1L;private Integer id;private String name;private Boolean isMale;private Integer[] sanWei;private Collection<String> familyMembers;private Map<String, String> scores;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Boolean isMale() {return isMale;}public void setMale(Boolean isMale) {this.isMale = isMale;}public Integer[] getSanWei() {return sanWei;}public void setSanWei(Integer[] sanWei) {this.sanWei = sanWei;}public Collection<String> getFamilyMembers() {return familyMembers;}public void setFamilyMembers(Collection<String> familyMembers) {this.familyMembers = familyMembers;}public Map<String, String> getScores() {return scores;}public void setScores(Map<String, String> scores) {this.scores = scores;}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + ", isMale=" + isMale + ", sanWei=" + Arrays.toString(sanWei)+ ", familyMembers=" + familyMembers + ", scores=" + scores + "]";}
}

4.3. 新建App1.java

package com.fj.t;import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;public class App1 {public static void main(String args[]) {String jsonString = "{\"id\":1111,\"name\":\"张三\",\"isMale\":false,\"sanWei\":[100,90,85],\"familyMembers\":[\"爸爸\",\"妈妈\",\"妹妹\"],\"scores\":{\"chinese\":\"90\",\"english\":\"90\",\"math\":\"100\"}}";JsonParser parser = new JsonParser();JsonElement rootNode = parser.parse(jsonString);Student student = new Student();if (rootNode.isJsonObject()) {JsonObject rootJO = rootNode.getAsJsonObject();student.setId(rootJO.get("id").getAsInt());student.setName(rootJO.get("name").getAsString());student.setMale(rootJO.get("isMale").getAsBoolean());JsonArray sanWeiJA = rootJO.getAsJsonArray("sanWei");Integer[] sanWei = new Integer[sanWeiJA.size()];for (int i = 0; i < sanWeiJA.size(); i++) {sanWei[i] = sanWeiJA.get(i).getAsJsonPrimitive().getAsInt();}student.setSanWei(sanWei);JsonArray familyMembersJA = rootJO.getAsJsonArray("familyMembers");Collection<String> familyMembers = new ArrayList<String>();for (int i = 0; i < familyMembersJA.size(); i++) {familyMembers.add(familyMembersJA.get(i).getAsJsonPrimitive().getAsString());}student.setFamilyMembers(familyMembers);Map<String, String> scores = new HashMap<String, String>();JsonObject scoresJO = rootJO.getAsJsonObject("scores");scores.put("chinese", scoresJO.get("chinese").getAsString());scores.put("english", scoresJO.get("english").getAsString());scores.put("math", scoresJO.get("math").getAsString());student.setScores(scores);}System.out.println(student);Type studentType = new TypeToken<Student>(){}.getType();GsonBuilder builder = new GsonBuilder();Gson gson = builder.create();
//      T fromJson(JsonElement json, Class<T> classOfT)将指定的json解析树反序列化为指定类的对象。System.out.println(gson.fromJson(rootNode, Student.class));
//      T fromJson(JsonElement json, Type typeOfT)将指定的json解析树按指定类型的适配器将其反序列化为对象。System.out.println((Student)gson.fromJson(rootNode, studentType));}
}

4.4. 运行App1.java

4.5. 新建App2.java

package com.fj.t;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonIOException;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonWriter;public class App2 {public static void main(String[] args) {Type studentType = new TypeToken<Student>(){}.getType();Student student = new Student();student.setId(1111);student.setName("张三");student.setMale(false);Integer[] sanWei = {100,90,85};student.setSanWei(sanWei);Collection<String> familyMembers = new ArrayList<String>();familyMembers.add("爸爸");familyMembers.add("妈妈");familyMembers.add("妹妹");student.setFamilyMembers(familyMembers);Map<String, String> scores = new HashMap<String, String>();scores.put("chinese", "90");scores.put("math", "100");scores.put("english", "90");student.setScores(scores);GsonBuilder builder = new GsonBuilder();Gson gson = builder.create();//        JsonElement toJsonTree(Object src)将指定的对象序列化为解析树。JsonElement je = gson.toJsonTree(student);
//      String toJson(JsonElement jsonElement)将指定的json解析树序列化为JSON字符串。System.out.println(gson.toJson(je));//     JsonElement toJsonTree(Object src, Type typeOfSrc) 将指定的对象按指定类型的适配器将其序列化为解析树。JsonElement jeT = gson.toJsonTree(student, studentType);try {FileWriter fileWriter = new FileWriter(new File("student.txt"));
//          void toJson(JsonElement jsonElement, Appendable writer)将指定的json解析树序列化为writer。gson.toJson(jeT, fileWriter);fileWriter.flush();fileWriter.close();} catch (JsonIOException | IOException e) {e.printStackTrace();}Writer out = new StringWriter();JsonWriter jw = new JsonWriter(out);
//      void toJson(JsonElement jsonElement, JsonWriter writer)将指定的json解析树序列化为writer。gson.toJson(jeT, jw);System.out.println(out.toString());}
}

4.6. 运行App2.java, 在项目根目录创建了student.txt

004_Gson树模型相关推荐

  1. 【组队学习】【30期】6. 树模型与集成学习

    树模型与集成学习 航路开辟者:耿远昊 领航员:姜萌 航海士:耿远昊 基本信息 开源内容:https://github.com/datawhalechina/machine-learning-toy-c ...

  2. 树模型集成学习(Tree Embedding)

    树模型集成学习 集成学习主要有两个思想,分别是bagging和boosting.树模型的集成模型都是使用树作为基模型,最常用的cart树,常见的集成模型有RandomForest.GBDT.Xgboo ...

  3. Nat. Mach. Intell.|从局部解释到全局理解的树模型

    今天介绍美国华盛顿大学保罗·艾伦计算机科学与工程学院的Su-In Lee团队在nature mechine intelligence 2020的论文,该论文提出了一种基于博弈论沙普利值的TreeExp ...

  4. R语言使用caret包构建遗传算法树模型(Tree Models from Genetic Algorithms )构建回归模型、通过method参数指定算法名称

    R语言使用caret包构建遗传算法树模型(Tree Models from Genetic Algorithms  )构建回归模型.通过method参数指定算法名称.通过trainControl函数控 ...

  5. xgboost不能解决哪些问题?为什么?进而说明树模型有哪些缺陷?那种模型能够树模型的这种缺陷?

    xgboost不能解决哪些问题?为什么?进而说明树模型有哪些缺陷?那种模型能够树模型的这种缺陷? 目录

  6. 深度学习核心技术精讲100篇(二十)-如何通过树模型实现梯度提升树(GBDT)+LR,随机森林(RandomForest) +LR

    前言 在讲如何通过树模型做特征工程之前,首先让我们回顾一下一个机器学习(除去深度学习项目部分)项目的大致流程: 从业务场景中抽象出问题--分类问题,回归问题,还是聚类问题等, 接下来是数据获取,数据清 ...

  7. ML之DT(树模型):DT(树模型算法)算法的简介、代码定义、案例应用之详细攻略

    ML之DT(树模型):DT(树模型算法)算法的简介.代码定义.案例应用之详细攻略 目录 树模型 1.A brief history of forests 2.树模型的复杂度 3.树模型的目标函数

  8. 树模型为什么是不能进行梯度下降

    对于树形结构为什么不需要归一化?机器学习 ML基础 易 答:数值缩放,不影响分裂点位置.因为第一步都是按照特征值进行排序的,排序的顺序不变,那么所属的分支以及分裂点就不会有不同.对于线性模型,比如说L ...

  9. Qt 可编辑的树模型(Tree Model)的一个实例

    本实例来自Qt 官方的一个实例(Editable Tree Model Example) 简介: 本实例是关于怎样基于模式视图框架下的 树模型的实现. 该模型支持可编辑的表单项,自定义表头,删除插入行 ...

最新文章

  1. 支持向量机(SVM)
  2. linux命令:fsck
  3. 查看电脑电池损耗的命令
  4. JUC锁-CountDownLatch(六)
  5. SAP BRF+ function mode VS event mode
  6. html坐标轴背景色,CSS 背景(css background)
  7. Java面向对象(7)--package和import关键字
  8. DDD理论学习系列(8)-- 应用服务领域服务
  9. Unix系统使用的地址索引结构有什么特点?
  10. Linux环境下查看CPU资源的命令
  11. angular读取html文件路径,angular中关于路径问题的详解
  12. 企业级oracle视频教程,企业级Oracle数据库高可用性(OracleDataGuard)DBA培训视频全集...
  13. 2.应用统计与随机过程第二章部分课上例题(平稳随机、各态历经)
  14. git fatal: unable to access *** Timed out
  15. Python实现中英互译
  16. 移动硬盘无法在ubuntu显示
  17. hr标签---中心线:设置颜色
  18. vue滑动窗口_vue-floating 浮窗组件、封装基于better-scroll的滑动组件、vue自定义手势指令...
  19. js visibility
  20. Ubuntu 配置电驴

热门文章

  1. Elasticsearch——Search的基本介绍
  2. ssh端口映射,本地转发
  3. HTTP长连接短连接
  4. Android关于notification的在不同API下的用法说明
  5. 用js操作table、tr、td 「字体样式及TD背景图片」
  6. [转] MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
  7. IPv4如何向IPv6过渡?—Vecloud微云
  8. 对比SQL Server和Oracle的关键参数
  9. 最简单的http服务器实现
  10. 【Java】 剑指offer(28) 对称的二叉树