Android Json的使用(2) 使用Jackson解析和生成json

时间:2022-09-01 17:45:09

使用Jackson的三种方式

  • 数据绑定模式:使用最方便
  • 流模式:性能最佳
  • 树模式:最灵活

以最常用的数据绑定模式为例

Json数据如下

  1. {
  2. "name" : { "first" : "Joe", "last" : "Sixpack" },
  3. "gender" : "MALE",
  4. "verified" : false,
  5. "userImage" : "Rm9vYmFyIQ=="
  6. }

json生成具体的java对象实例

  1. ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
  2. User user = mapper.readValue(new File("user.json"), User.class);

下面是User类:

  1. public class User {
  2. public enum Gender { MALE, FEMALE };
  3. public static class Name {
  4. private String _first, _last;
  5. public String getFirst() { return _first; }
  6. public String getLast() { return _last; }
  7. public void setFirst(String s) { _first = s; }
  8. public void setLast(String s) { _last = s; }
  9. }
  10. private Gender _gender;
  11. private Name _name;
  12. private boolean _isVerified;
  13. private byte[] _userImage;
  14. public Name getName() { return _name; }
  15. public boolean isVerified() { return _isVerified; }
  16. public Gender getGender() { return _gender; }
  17. public byte[] getUserImage() { return _userImage; }
  18. public void setName(Name n) { _name = n; }
  19. public void setVerified(boolean b) { _isVerified = b; }
  20. public void setGender(Gender g) { _gender = g; }
  21. public void setUserImage(byte[] b) { _userImage = b; }

从Java对象转换成Json

  1. mapper.writeValue(new File("user-modified.json"), user);

树模式例子

你还有另外一种方式来使用Jackson,就是使用树模式。这个就像XML的DOM树。Jackson用JsonNode来生成树。

如下所示:

  1. ObjectMapper m = new ObjectMapper();
  2. // can either use mapper.readTree(source), or mapper.readValue(source, JsonNode.class);
  3. JsonNode rootNode = m.readTree(new File("user.json"));
  4. // ensure that "last name" isn't "Xmler"; if is, change to "Jsoner"
  5. JsonNode nameNode = rootNode.path("name");
  6. String lastName = nameNode.path("last").getTextValue().
  7. if ("xmler".equalsIgnoreCase(lastName)) {
  8. ((ObjectNode)nameNode).put("last", "Jsoner");
  9. }
  10. // and write it out:
  11. m.writeValue(new File("user-modified.json"), rootNode);

你也可以自己构造一个树:

  1. TreeMapper treeMapper = new TreeMapper();
  2. ObjectNode userOb = treeMapper.objectNode();
  3. Object nameOb = userRoot.putObject("name");
  4. nameOb.put("first", "Joe");
  5. nameOb.put("last", "Sixpack");
  6. userOb.put("gender", User.Gender.MALE.toString());
  7. userOb.put("verified", false);
  8. byte[] imageData = getImageData(); // or wherever it comes from
  9. userOb.put("userImage", imageData);

流模式

这是最高效的模式。

生成json文本

  1. JsonFactory f = new JsonFactory();
  2. JsonGenerator g = f.createJsonGenerator(new File("user.json"));
  3. g.writeStartObject();
  4. g.writeObjectFieldStart("name");
  5. g.writeStringField("first", "Joe");
  6. g.writeStringField("last", "Sixpack");
  7. g.writeEndObject(); // for field 'name'
  8. g.writeStringField("gender", Gender.MALE);
  9. g.writeBooleanField("verified", false);
  10. g.writeFieldName("userImage"); // no 'writeBinaryField' (yet?)
  11. byte[] binaryData = ...;
  12. g.writeBinary(binaryData);
  13. g.writeEndObject();
  14. g.close(); // important: will force flushing of output, close underlying output stream

解析Json

  1. JsonFactory f = new JsonFactory();
  2. JsonParser jp = f.createJsonParser(new File("user.json"));
  3. User user = new User();
  4. jp.nextToken(); // will return JsonToken.START_OBJECT (verify?)
  5. while (jp.nextToken() != JsonToken.END_OBJECT) {
  6. String fieldname = jp.getCurrentName();
  7. jp.nextToken(); // move to value, or START_OBJECT/START_ARRAY
  8. if ("name".equals(fieldname)) { // contains an object
  9. Name name = new Name();
  10. while (jp.nextToken() != JsonToken.END_OBJECT) {
  11. String namefield = jp.getCurrentName();
  12. jp.nextToken(); // move to value
  13. if ("first".equals(namefield)) {
  14. name.setFirst(jp.getText());
  15. } else if ("last".equals(namefield)) {
  16. name.setLast(jp.getText());
  17. } else {
  18. throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");
  19. }
  20. }
  21. user.setName(name);
  22. } else if ("gender".equals(fieldname)) {
  23. user.setGender(User.Gender.valueOf(jp.getText()));
  24. } else if ("verified".equals(fieldname)) {
  25. user.setVerified(jp.getCurrentToken() == JsonToken.VALUE_TRUE);
  26. } else if ("userImage".equals(fieldname)) {
  27. user.setUserImage(jp.getBinaryValue());
  28. } else {
  29. throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");
  30. }
  31. }
  32. jp.close(); // ensure resources get cleaned up timely and properly

详细内容参见:http://wiki.fasterxml.com/JacksonInFiveMinutes

使用Jackson的三种方式

  • 数据绑定模式:使用最方便
  • 流模式:性能最佳
  • 树模式:最灵活

以最常用的数据绑定模式为例

Json数据如下

  1. {
  2. "name" : { "first" : "Joe", "last" : "Sixpack" },
  3. "gender" : "MALE",
  4. "verified" : false,
  5. "userImage" : "Rm9vYmFyIQ=="
  6. }

json生成具体的java对象实例

  1. ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
  2. User user = mapper.readValue(new File("user.json"), User.class);

下面是User类:

  1. public class User {
  2. public enum Gender { MALE, FEMALE };
  3. public static class Name {
  4. private String _first, _last;
  5. public String getFirst() { return _first; }
  6. public String getLast() { return _last; }
  7. public void setFirst(String s) { _first = s; }
  8. public void setLast(String s) { _last = s; }
  9. }
  10. private Gender _gender;
  11. private Name _name;
  12. private boolean _isVerified;
  13. private byte[] _userImage;
  14. public Name getName() { return _name; }
  15. public boolean isVerified() { return _isVerified; }
  16. public Gender getGender() { return _gender; }
  17. public byte[] getUserImage() { return _userImage; }
  18. public void setName(Name n) { _name = n; }
  19. public void setVerified(boolean b) { _isVerified = b; }
  20. public void setGender(Gender g) { _gender = g; }
  21. public void setUserImage(byte[] b) { _userImage = b; }

从Java对象转换成Json

  1. mapper.writeValue(new File("user-modified.json"), user);

树模式例子

你还有另外一种方式来使用Jackson,就是使用树模式。这个就像XML的DOM树。Jackson用JsonNode来生成树。

如下所示:

  1. ObjectMapper m = new ObjectMapper();
  2. // can either use mapper.readTree(source), or mapper.readValue(source, JsonNode.class);
  3. JsonNode rootNode = m.readTree(new File("user.json"));
  4. // ensure that "last name" isn't "Xmler"; if is, change to "Jsoner"
  5. JsonNode nameNode = rootNode.path("name");
  6. String lastName = nameNode.path("last").getTextValue().
  7. if ("xmler".equalsIgnoreCase(lastName)) {
  8. ((ObjectNode)nameNode).put("last", "Jsoner");
  9. }
  10. // and write it out:
  11. m.writeValue(new File("user-modified.json"), rootNode);

你也可以自己构造一个树:

  1. TreeMapper treeMapper = new TreeMapper();
  2. ObjectNode userOb = treeMapper.objectNode();
  3. Object nameOb = userRoot.putObject("name");
  4. nameOb.put("first", "Joe");
  5. nameOb.put("last", "Sixpack");
  6. userOb.put("gender", User.Gender.MALE.toString());
  7. userOb.put("verified", false);
  8. byte[] imageData = getImageData(); // or wherever it comes from
  9. userOb.put("userImage", imageData);

流模式

这是最高效的模式。

生成json文本

  1. JsonFactory f = new JsonFactory();
  2. JsonGenerator g = f.createJsonGenerator(new File("user.json"));
  3. g.writeStartObject();
  4. g.writeObjectFieldStart("name");
  5. g.writeStringField("first", "Joe");
  6. g.writeStringField("last", "Sixpack");
  7. g.writeEndObject(); // for field 'name'
  8. g.writeStringField("gender", Gender.MALE);
  9. g.writeBooleanField("verified", false);
  10. g.writeFieldName("userImage"); // no 'writeBinaryField' (yet?)
  11. byte[] binaryData = ...;
  12. g.writeBinary(binaryData);
  13. g.writeEndObject();
  14. g.close(); // important: will force flushing of output, close underlying output stream

解析Json

  1. JsonFactory f = new JsonFactory();
  2. JsonParser jp = f.createJsonParser(new File("user.json"));
  3. User user = new User();
  4. jp.nextToken(); // will return JsonToken.START_OBJECT (verify?)
  5. while (jp.nextToken() != JsonToken.END_OBJECT) {
  6. String fieldname = jp.getCurrentName();
  7. jp.nextToken(); // move to value, or START_OBJECT/START_ARRAY
  8. if ("name".equals(fieldname)) { // contains an object
  9. Name name = new Name();
  10. while (jp.nextToken() != JsonToken.END_OBJECT) {
  11. String namefield = jp.getCurrentName();
  12. jp.nextToken(); // move to value
  13. if ("first".equals(namefield)) {
  14. name.setFirst(jp.getText());
  15. } else if ("last".equals(namefield)) {
  16. name.setLast(jp.getText());
  17. } else {
  18. throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");
  19. }
  20. }
  21. user.setName(name);
  22. } else if ("gender".equals(fieldname)) {
  23. user.setGender(User.Gender.valueOf(jp.getText()));
  24. } else if ("verified".equals(fieldname)) {
  25. user.setVerified(jp.getCurrentToken() == JsonToken.VALUE_TRUE);
  26. } else if ("userImage".equals(fieldname)) {
  27. user.setUserImage(jp.getBinaryValue());
  28. } else {
  29. throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");
  30. }
  31. }
  32. jp.close(); // ensure resources get cleaned up timely and properly

详细内容参见:http://wiki.fasterxml.com/JacksonInFiveMinutes

 

Android Json的使用(2) 使用Jackson解析和生成json的更多相关文章

  1. 运用 三种 原生 谷歌 阿里 解析和生成json

    三种类生成JSON数据方法 JSON(原生): 第一种 JSONStringer和JSONObject区别在于添加对象时是按顺序添加的比如说 JSONStringer 添加 a:1 b:2 c:3那么 ...

  2. Json1:使用gson解析、生成json

    Json解析: 1.json第三方解析包:json-lib.gson.jackson.fastjson等2.Google-gson只兼容jdk1.5版本以上:JSON-lib分别支持1.4和1.53. ...

  3. AJAX html 传输json字符串&&巧妙运用eval()来解析返回的JSON字符串

    1.AJAX html 传输json字符串: js方法如下: function saveRetYwlsh(){ var xmbh = document.getElementById("xmb ...

  4. 使用gson解析,生成Json

    包:gson-2.3.jarJson文本解析为Java对象:Java对象生成为Json文本 import com.google.gson.Gson; public class TestGson { c ...

  5. 使用JSONObject解析和生成json

    创建JSON 引用org.json包,推荐通过maven引用 1.直接构建 JSONObject obj = new JSONObject(); obj.put("sex", &q ...

  6. Json4:使用json-lib解析、生成Json

    特征:1.包多2.JSONObject.fromObject import net.sf.json.JSONObject; public class JsonLib { public static v ...

  7. 解决npm ERR!Unexpected end of JSON input while paring near (解析附近时JSON输入意外结束)'...."^2.0.0-rc.0","glob"'等npm install错误

    摘要 最近更新了一次node,但是更新后npm的命令总是会报 npm WARN deprecated fsevents@2.0.6: Please update: there are crash fi ...

  8. [转] Android:用GSON 五招之内搞定任何JSON数组

    [From] http://www.open-open.com/lib/view/open1472632967912.html 写在前面 关于GSON的入门级使用,这里就不提了,如有需要可以看这篇博文 ...

  9. 使用jsoncpp解析生成json

    在此站点下载jsoncpp(https://sourceforge.net/projects/jsoncpp/这个站点的版本较旧) 在电脑上安装Python,运行amalgamate.py,生成的di ...

随机推荐

  1. 戴尔OMSA 使用指南

    戴尔的OMSA我们已经安装完成,但是没有web页面.因此我们目前想要看到服务器的相关硬件信息就需要使用命令行的方式获取了.那么,这里就介绍如何使用命令获取服务器硬件信息. 下面是我监控一些硬件信息的命 ...

  2. 数据库Date类型和JavaDate类型的转换

    问题:     java.lang.ClassCastException : java.util.Date cannot be cast to java.sql.Date 1.若是想将字符串装换成sq ...

  3. ScheduledExecutorFactoryBean忽略异常继续执行

    ScheduledExecutorFactoryBean忽略异常继续执行 程序中有一个定时任务,每10分钟把满足条件的任务从一个表迁移到另一张表,程序启动的时候数据库异常了一段时间,之后数据库恢复了. ...

  4. 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之二

    好了,废话也不多说,咱们直接来看看这款MVC的造型——你可能会大吼:“这……这特么的都是些什么鬼?” 靠,告诉你吧,我也不知道这都是些什么鬼,反正以前我是没有见过这样的MVC.咦,老纸的config文 ...

  5. 2017蓝桥杯 省赛C题(承压计算)

    X星球的高科技实验室中整齐地堆放着某批珍贵金属原料. 每块金属原料的外形.尺寸完全一致,但重量不同.金属材料被严格地堆放成金字塔形. 7 5 8 7 8 8 9 2 7 2 8 1 4 9 1 8 1 ...

  6. 21. Merge Two Sorted Lists (Java 合并有序链表 空间复杂度O(1))

    题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...

  7. NC 5的开发环境起不了客户端

    5的开发环境,中间件启动无异常,但是在起客户端时报错,连中间件也关闭了. 添加图中两个jdk下的包

  8. Mac 平台安装 Android Studio 集成 Android SDK

    最近写个小工具,给周边一些朋友用用(类似任务执行),一开始 任务执行用Python写的,部署在云端,有一些局限(资金开销):现准备写一个任务端,需要用到的人直接装个客户端就行,于是准备写个客户端版本的 ...

  9. 2018.10.18 NOIP训练 [SCOI2018]Pipi 酱的日常(线段树)

    传送门 线段树好题啊. 题目要求的是sum−a−b−c+maxsum-a-b-c+maxsum−a−b−c+max{∣a+v∣+∣b+v∣+∣c+v∣|a+v|+|b+v|+|c+v|∣a+v∣+∣b ...

  10. 【Nodejs】nimble或async并不能保证程序串行执行,回调是回避不了的坑

    先看一段例程: //------------------------------- // 用于创建目录 //------------------------------- function creat ...