一.Jackson使用Tree Model读取以及更新JSON
使用ObjectMapper,可以以类似读取DOM的方式读取JSON,实例如下:
package com.bijian.study; import java.util.Iterator; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.node.ObjectNode; public class JacksonDemo01 { public static void main(String[] args) { JacksonParseJSON(); JacksonUpdateJSON(); } private static void JacksonParseJSON() { System.out.println("JacksonParseJSON():"); System.out.println("***************************************"); String str = "{\"weatherinfo\":{\"city\":\"杭州\",\"city_en\":\"hangzhou\",\"date_y\":\"2014年1月12日\",\"date\":\"2016-03-17 15:46:20\",\"week\":\"星期日\",\"fchh\":\"11\",\"cityid\":\"101210101\"}}"; ObjectMapper m = new ObjectMapper(); try { JsonNode rootNode = m.readTree(str); JsonNode weaNode = rootNode.get("weatherinfo"); System.out.println(weaNode); System.out.println(weaNode.get("city")); // Use Iterator to traverse to tree Iterator<String> keys = weaNode.getFieldNames(); while(keys.hasNext()){ String fieldName = keys.next(); System.out.println(fieldName + ": " + weaNode.get(fieldName).getTextValue()); } System.out.println("***************************************"); } catch (Exception e) { e.printStackTrace(); } } private static void JacksonUpdateJSON() { System.out.println("JacksonUpdateJSON():"); System.out.println("***************************************"); ObjectMapper mapper = new ObjectMapper(); // will be of type ObjectNode JsonNode rootNode = mapper.createObjectNode(); ((ObjectNode) rootNode).put("name", "jingshou"); ((ObjectNode) rootNode).put("id", 523); ((ObjectNode) rootNode).put("age", 30); System.out.println(rootNode); try { String json = mapper.writeValueAsString(rootNode); System.out.println(json); ((ObjectNode) rootNode).remove("id"); System.out.println(rootNode); System.out.println("***************************************"); } catch (Exception e) { e.printStackTrace(); } } }
运行结果:
JacksonParseJSON(): *************************************** {"city":"杭州","city_en":"hangzhou","date_y":"2014年1月12日","date":"2016-03-17 15:46:20","week":"星期日","fchh":"11","cityid":"101210101"} "杭州" city: 杭州 city_en: hangzhou date_y: 2014年1月12日 date: 2016-03-17 15:46:20 week: 星期日 fchh: 11 cityid: 101210101 *************************************** JacksonUpdateJSON(): *************************************** {"name":"jingshou","id":523,"age":30} {"name":"jingshou","id":523,"age":30} {"name":"jingshou","age":30} ***************************************
二.Jackson的对象与json之间的转换
package com.bijian.study; import java.io.StringWriter; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.ObjectMapper; import com.bijian.study.dto.User; import com.bijian.study.dto.Weather; public class JacksonDemo02 { public static void main(String[] args) { JacksonChangeJSON01(); JacksonChangeJSON02(); } /** * Jackson的对象与json之间的转换 */ private static void JacksonChangeJSON01() { StringBuilder sb = new StringBuilder(); sb.append("{"); sb.append("\"name\" : { \"first\" : \"Joe\", \"last\" : \"Sixpack\" },"); sb.append("\"gender\" : \"MALE\","); sb.append("\"verified\" : false,"); sb.append("\"userImage\" : \"Rm9vYmFyIQ==\""); sb.append("}"); ObjectMapper mapper = new ObjectMapper(); try { User user = mapper.readValue(sb.toString(), User.class); ObjectMapper mapper2 = new ObjectMapper(); StringWriter sw = new StringWriter(); JsonGenerator gen = new JsonFactory().createJsonGenerator(sw); mapper2.writeValue(gen, user); gen.close(); String json = sw.toString(); System.out.println(json); } catch (Exception e) { e.printStackTrace(); } } /** * Jackson的对象与json之间的转换 */ private static void JacksonChangeJSON02() { String str = "{\"city\":\"杭州\",\"city_en\":\"hangzhou\",\"date_y\":\"2014年1月12日\",\"date\":\"2016-03-17\",\"week\":\"星期日\",\"fchh\":\"11\",\"cityid\":\"101210101\"}"; ObjectMapper m = new ObjectMapper(); try { Weather w = m.readValue(str, Weather.class); ObjectMapper mapper2 = new ObjectMapper(); StringWriter sw = new StringWriter(); JsonGenerator gen = new JsonFactory().createJsonGenerator(sw); mapper2.writeValue(gen, w); gen.close(); String json = sw.toString(); System.out.println(json); } catch (Exception e) { e.printStackTrace(); } } }
package com.bijian.study.dto; public class User { public enum Gender { MALE, FEMALE }; public static class Name { private String _first, _last; public String getFirst() { return _first; } public String getLast() { return _last; } public void setFirst(String s) { _first = s; } public void setLast(String s) { _last = s; } } private Gender _gender; private Name _name; private boolean _isVerified; private byte[] _userImage; public Name getName() { return _name; } public boolean isVerified() { return _isVerified; } public Gender getGender() { return _gender; } public byte[] getUserImage() { return _userImage; } public void setName(Name n) { _name = n; } public void setVerified(boolean b) { _isVerified = b; } public void setGender(Gender g) { _gender = g; } public void setUserImage(byte[] b) { _userImage = b; } }
package com.bijian.study.dto; import java.util.Date; public class Weather { private String city; private String city_en; private String date_y; private Date date; private String week; private int fchh; private String cityid; public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getCity_en() { return city_en; } public void setCity_en(String city_en) { this.city_en = city_en; } public String getDate_y() { return date_y; } public void setDate_y(String date_y) { this.date_y = date_y; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public String getWeek() { return week; } public void setWeek(String week) { this.week = week; } public int getFchh() { return fchh; } public void setFchh(int fchh) { this.fchh = fchh; } public String getCityid() { return cityid; } public void setCityid(String cityid) { this.cityid = cityid; } }
运行结果:
{"verified":false,"gender":"MALE","userImage":"Rm9vYmFyIQ==","name":{"first":"Joe","last":"Sixpack"}} {"city":"杭州","city_en":"hangzhou","date_y":"2014年1月12日","date":1458172800000,"week":"星期日","fchh":11,"cityid":"101210101"}
三.设置时间格式
package com.bijian.study; import java.io.StringWriter; import java.text.SimpleDateFormat; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig.Feature; import com.bijian.study.dto.Weather; public class JacksonDemo03 { /** * Json时间格式 */ private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; static ObjectMapper mapper = null; static{ mapper = new ObjectMapper(); SimpleDateFormat fmt = new SimpleDateFormat(DATE_FORMAT); mapper.setDateFormat(fmt); mapper.enable(Feature.WRITE_NULL_MAP_VALUES); mapper.enable(Feature.WRITE_EMPTY_JSON_ARRAYS); } public static <T> T parse(JsonNode root, Class<T> rootType) { try { return mapper.readValue(root, rootType); } catch (Exception e) { throw new RuntimeException("JsonNode转换" + rootType.getName() + "异常", e); } } public static void main(String[] args) { jacksonChangeJson(); } private static void jacksonChangeJson() { String str = "{\"weatherinfo\":{\"city\":\"杭州\",\"city_en\":\"hangzhou\",\"date_y\":\"2014年1月12日\",\"date\":\"2016-03-17 15:46:20\",\"week\":\"星期日\",\"fchh\":\"11\",\"cityid\":\"101210101\"}}"; try { JsonNode rootNode = mapper.readTree(str); JsonNode weaNode = rootNode.get("weatherinfo"); Weather w = mapper.readValue(weaNode, Weather.class); // Weather w = parse(weaNode, Weather.class); ObjectMapper mapper2 = new ObjectMapper(); StringWriter sw = new StringWriter(); JsonGenerator gen = new JsonFactory().createJsonGenerator(sw); mapper2.writeValue(gen, w); gen.close(); String json = sw.toString(); System.out.println(json); } catch (Exception e) { e.printStackTrace(); } } }
运行结果 :
{"city":"杭州","city_en":"hangzhou","date_y":"2014年1月12日","date":1458200780000,"week":"星期日","fchh":11,"cityid":"101210101"}
四.抽取完善实例
package com.bijian.study; import java.io.StringWriter; import java.text.SimpleDateFormat; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig.Feature; import com.bijian.study.dto.BaseInfoDTO; public class JacksonDemo04 { private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; static ObjectMapper mapper = null; static{ mapper = new ObjectMapper(); SimpleDateFormat fmt = new SimpleDateFormat(DATE_FORMAT); mapper.setDateFormat(fmt); mapper.enable(Feature.WRITE_NULL_MAP_VALUES); mapper.enable(Feature.WRITE_EMPTY_JSON_ARRAYS); } public static <T> T parse(JsonNode root, Class<T> rootType) { try { return mapper.readValue(root, rootType); } catch (Exception e) { throw new RuntimeException("JsonNode转换" + rootType.getName() + "异常", e); } } public static void main(String[] args) { jacksonChangeJson(); } private static void jacksonChangeJson() { String str = "{\"id\":\"FC75C4AE61A04B49912C789A72D47F16\",\"detailList\":[{\"id\":\"D4416D08A9CE4AB882AA7EFC3EE66B14\",\"baseInfoId\":null,\"companyCode\":\"203\",\"companyName\":\"支付宝\",\"scale\":0.85},{\"id\":\"1392C28C4C6E422983F4EACC0C52A014\",\"baseInfoId\":null,\"companyCode\":\"211\",\"companyName\":\"微信\",\"scale\":0.15}],\"mark\":\"2\"}"; try { //法一:ObjectMapper的readValue方法操作JsonNode节点,一般在解析JsonNode中的子节点时用到 // JsonNode rootNode = mapper.readTree(str); // BaseInfoDTO c = mapper.readValue(rootNode, BaseInfoDTO.class); //法二:ObjectMapper的readValue方法做下封装 // JsonNode rootNode = mapper.readTree(str); // BaseInfoDTO c = parse(rootNode, BaseInfoDTO.class); //法三:ObjectMapper的readValue方法直接操作JSON串 BaseInfoDTO c = mapper.readValue(str, BaseInfoDTO.class); ObjectMapper mapper2 = new ObjectMapper(); StringWriter sw = new StringWriter(); JsonGenerator gen = new JsonFactory().createJsonGenerator(sw); mapper2.writeValue(gen, c); gen.close(); String json = sw.toString(); System.out.println(json); } catch (Exception e) { e.printStackTrace(); } } }
package com.bijian.study.dto; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; public class AbstractDTO { /** * 序列化 */ private static final long serialVersionUID = -6492889909372878745L; /** * 主键id */ private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } /** * ToString方法 */ public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE); } }
package com.bijian.study.dto; import java.util.List; public class BaseInfoDTO extends AbstractDTO { /** * 序列化 */ private static final long serialVersionUID = -1354767346065648328L; /** * 详细信息描述 */ private List<DetailDTO> detailList; private String mark; public List<DetailDTO> getDetailList() { return detailList; } public void setDetailList(List<DetailDTO> detailList) { this.detailList = detailList; } public String getMark() { return mark; } public void setMark(String mark) { this.mark = mark; } }
package com.bijian.study.dto; public class DetailDTO extends AbstractDTO { /** * 序列化 */ private static final long serialVersionUID = -8405894524309728426L; /**基本信息(外键)*/ private String baseInfoId; private String companyCode; private String companyName; private Double scale; public String getBaseInfoId() { return baseInfoId; } public void setBaseInfoId(String baseInfoId) { this.baseInfoId = baseInfoId; } public String getCompanyCode() { return companyCode; } public void setCompanyCode(String companyCode) { this.companyCode = companyCode; } public String getCompanyName() { return companyName; } public void setCompanyName(String companyName) { this.companyName = companyName; } public Double getScale() { return scale; } public void setScale(Double scale) { this.scale = scale; } }
运行结果:
{"id":"FC75C4AE61A04B49912C789A72D47F16","detailList":[{"id":"D4416D08A9CE4AB882AA7EFC3EE66B14","baseInfoId":null,"companyCode":"203","companyName":"支付宝","scale":0.85},{"id":"1392C28C4C6E422983F4EACC0C52A014","baseInfoId":null,"companyCode":"211","companyName":"微信","scale":0.15}],"mark":"2"}
相关推荐
在本篇文章中,我们将通过实例来入门Jackson的使用。 一、Jackson库简介 Jackson库的核心组件包括: 1. `Jackson-databind`:提供将Java对象映射到JSON和从JSON反序列化回Java对象的功能。 2. `Jackson-core`:基础...
Magyar在其导言部分提到,尽管Jackson的书在某些方面非常出色,但也存在不足之处:书中有时假定了读者对某些材料已有所了解、遗漏了一些重要的步骤以及提供的实例不够充分。这些因素使得该书不太适合作为入门级教材...
总的来说,“Android日记本学习实例”是一个综合性的项目,涵盖了Android开发中的多个重要知识点,包括Activity、Intent、布局设计、SQLite数据库、权限管理和网络通信等。通过这个实例,你可以更深入地理解和掌握...
19. **JSON处理**:JSON作为一种轻量级的数据交换格式,学习使用Gson或Jackson库进行解析和序列化。 20. **单元测试**:使用JUnit进行代码测试,确保程序的正确性。 以上只是Java初学者实例中可能涉及的部分关键...
通过深入学习和实践这个Jackson实例源码,开发者不仅可以掌握如何在Java中有效地处理JSON,还可以了解如何优化性能,避免内存溢出,以及如何根据项目需求定制JSON处理策略。这将对提高Java项目的质量和效率大有裨益...
该书在某些地方假设了读者对基础材料的熟悉度,省略了关键步骤,并且提供的实例不足。对于初学者而言,这可能是一本难以消化的书籍。然而,Jackson的野心在于他几乎涵盖了经典电磁理论的大部分内容,除了一些明显的...
通过阅读API文档,你可以学习如何创建`ObjectMapper`实例,如何序列化和反序列化对象,如何配置序列化过程,以及如何处理日期、自定义类型和其他复杂数据结构。 在实际开发中,Jackson可以处理以下场景: - 将Java...
Jackson是Java领域中广泛使用的库,它主要用于处理JSON数据,实现了JSON与Java对象之间的相互转换。这个名为"jackson2.6"的压缩包...通过学习和熟练掌握Jackson,开发者可以极大地提高工作效率,降低JSON操作的复杂性。
通过实例源码,我们可以学习如何正确构建和传递Intent,以及处理Activity之间的跳转和数据传递。 2. **Layout设计**: Android的布局管理器如LinearLayout、RelativeLayout、ConstraintLayout等,是构建用户界面的...
在这个名为"JAVA-jackson.zip"的压缩包中,包含了学习Jackson和JSON解析所需的资源。 首先,我们要了解Jackson库的核心组件。主要有三个: 1. **Jackson-databind**:这是Jackson的核心模块,提供了将Java对象转换...
例如,一个常见的用法是创建一个`ObjectMapper`实例,然后使用它的`readValue()`和`writeValue()`方法来读写JSON数据。同时,通过注解可以在不修改模型类的情况下,灵活地控制序列化和反序列化的行为。 总的来说,...
4. 数据绑定:Jackson的数据绑定机制使它能直接将JSON解析到Java对象的实例,或从对象生成JSON,无需编写额外的代码。这对于构建RESTful API和处理JSON数据的Web服务非常有用。 5. 流式API:除了数据绑定,Jackson...
5. **网络编程**:HTTP请求库如Volley、OkHttp的使用,学习JSON解析(如Gson、Jackson)及上传下载数据。 6. **图片加载与缓存**:理解并实现图片加载库如Picasso、Glide,学习图片的缓存策略。 7. **多媒体处理**...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web服务和应用程序之间的数据传输,因为...通过深入学习和实践,开发者可以充分利用Jackson的功能,提高开发效率并优化JSON相关的代码质量。
3. **网络通信**:Android应用常常需要与服务器进行数据交换,实例可能涵盖了使用HttpURLConnection、OkHttp或Retrofit进行网络请求,以及使用Gson或Jackson进行JSON数据解析。 4. **异步处理**:Android中的主线程...
4. **广播接收器(BroadcastReceiver)**:广播是Android中全局事件通知机制,开发者可以通过实例学习如何注册和使用BroadcastReceiver,以应对系统或自定义广播事件。 5. **内容提供者(ContentProvider)**:内容...
在Android平台上开发一个天气预报应用是一项常见的任务,它涉及到网络通信、数据解析、UI设计等多个技术领域。在这个“android 天气预报实例”中,我们...通过这个实例的学习,开发者能够提升在实际项目中的综合技能。
这个实例对初学者来说具有很高的学习价值,因为它涵盖了Android开发的多个关键点,同时通过实际的项目练习能更好地理解和掌握这些知识点。如果你在学习过程中遇到任何问题,记得联系提供此实例的开发者,他们可能会...
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛用于前后端数据传输。...通过深入学习和实践,开发者可以充分利用Jackson的功能,提高项目的可维护性和性能。