`

使用Jackson在Java中处理JSON

 
阅读更多

前一段工作中总会遇到使用Java处理JSON的情况,大部分都使用的是开源工具Jackson实现的。

因此总结一下发上来,希望对看到的人有所帮助。

------------------------------------------------------------

一、入门

Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换。

1Java对象转换为JSON

User user=new User(); //Java Object

ObjectMapper mapper = new ObjectMapper();

mapper.writeValueAsString(user); //返回字符串

//输出格式化后的字符串(有性能损耗)

mapper.defaultPrettyPrintingWriter().writeValueAsString(user);

mapper.writeValue(new File("c:\\user.json"), user); //指定文件写入

 

//设置序列化配置(全局),设置序列化时不输出空值.

sharedMapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);

 

2JSON反序列化为Java对象:

ObjectMapper mapper = new ObjectMapper();

//解析器支持解析单引号

mapper.configure(Feature.ALLOW_SINGLE_QUOTES,true);

//解析器支持解析结束符

mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS,true);

HashMap jsonMap = mapper.readValue(json,HashMap.class); //转换为HashMap对象

 

二、Jackson支持3种使用方式:

1、Data Binding:最方便使用.

(1)Full Data Binding:

private static final String MODEL_BINDING = "{\"name\":\"name1\",\"type\":1}";
	public void fullDataBinding() throws Exception{
		ObjectMapper mapper = new ObjectMapper();
		Model user = mapper.readValue(MODEL_BINDING, Model.class);//readValue到一个实体类中.
		System.out.println(user.getName());
		System.out.println(user.getType());
	}

Model类:

private static class Model{
		private String name;
		private int type;
		
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public int getType() {
			return type;
		}
		public void setType(int type) {
			this.type = type;
		}
	}

(2)Raw Data Binding:

/**
	Concrete Java types that Jackson will use for simple data binding are:
	JSON Type   	Java Type
	object			LinkedHashMap<String,Object>
	array			ArrayList<Object>
	string			String
	number(no fraction)	Integer, Long or BigInteger (smallest applicable)
	number(fraction)	Double(configurable to use BigDecimal)
	true|false		Boolean
	null			null
	*/
	public void rawDataBinding() throws Exception{
		ObjectMapper mapper = new ObjectMapper();
		HashMap map = mapper.readValue(MODEL_BINDING,HashMap.class);//readValue到一个原始数据类型.
		System.out.println(map.get("name"));
		System.out.println(map.get("type"));
	}

 (3)generic Data Binding:

private static final String GENERIC_BINDING = "{\"key1\":{\"name\":\"name2\",\"type\":2},\"key2\":{\"name\":\"name3\",\"type\":3}}";
	public void genericDataBinding() throws Exception{
		ObjectMapper mapper = new ObjectMapper();
		HashMap<String,Model> modelMap = mapper.readValue(GENERIC_BINDING,new TypeReference<HashMap<String,Model>>(){});//readValue到一个范型数据中.
		Model model = modelMap.get("key2");
		System.out.println(model.getName());
		System.out.println(model.getType());
	}

2、Tree Model:最灵活。

private static final String TREE_MODEL_BINDING = "{\"treekey1\":\"treevalue1\",\"treekey2\":\"treevalue2\",\"children\":[{\"childkey1\":\"childkey1\"}]}";
	public void treeModelBinding() throws Exception{
		ObjectMapper mapper = new ObjectMapper();
		JsonNode rootNode = mapper.readTree(TREE_MODEL_BINDING);
		//path与get作用相同,但是当找不到该节点的时候,返回missing node而不是Null.
		String treekey2value = rootNode.path("treekey2").getTextValue();//
		System.out.println("treekey2value:" + treekey2value);
		JsonNode childrenNode = rootNode.path("children");
		String childkey1Value = childrenNode.get(0).path("childkey1").getTextValue();
		System.out.println("childkey1Value:"+childkey1Value);
		
		//创建根节点
		ObjectNode root = mapper.createObjectNode();
		//创建子节点1
		ObjectNode node1 = mapper.createObjectNode();
		node1.put("nodekey1",1);
		node1.put("nodekey2",2);
		//绑定子节点1
		root.put("child",node1);
		//数组节点
		ArrayNode arrayNode = mapper.createArrayNode();
		arrayNode.add(node1);
		arrayNode.add(1);
		//绑定数组节点
		root.put("arraynode", arrayNode);
		//JSON读到树节点
		JsonNode valueToTreeNode = mapper.valueToTree(TREE_MODEL_BINDING);
		//绑定JSON节点
		root.put("valuetotreenode",valueToTreeNode);
		//JSON绑定到JSON节点对象
		JsonNode bindJsonNode = mapper.readValue(GENERIC_BINDING, JsonNode.class);//绑定JSON到JSON节点对象.
		//绑定JSON节点
		root.put("bindJsonNode",bindJsonNode);
		System.out.println(mapper.writeValueAsString(root));
	}

3、Streaming API:最佳性能。

见官方文档例子。

 

参考资料:

1http://wiki.fasterxml.com/JacksonInFiveMinutes Jackson官方教程示例

2http://wiki.fasterxml.com/JacksonJavaDocs Jackson在线API文档

3、http://hjg1988.iteye.com/blog/561368 JSON工具性能比较:json-libjackson进行Java对象到json字符串序列化。

 

分享到:
评论
2 楼 di1984HIT 2017-12-31  
xuexile!!
1 楼 yangchengfyj 2015-05-31  
mapper.writeValueAsString(model)

------------------------------------
我使用这个方法的时候 获取的对象输出后。发现少字段!怎么解决!

相关推荐

    Java中使用Json

    本文将深入探讨在Java中如何使用JSON,以及其在实际开发中的应用场景。 首先,Java中处理JSON的主要工具有两个:Jackson和Gson。这两个库提供了API,可以帮助我们轻松地将Java对象转换为JSON字符串,以及将JSON字符...

    使用jackson完成json与java对象的互相转换实例

    在上述例子中,`password`字段不会出现在JSON中,`address`字段只有当其值不为null时才会被序列化。 4. **自定义类型转换** 对于复杂的类型转换,可以定义`JsonSerializer`和`JsonDeserializer`,或者使用`@...

    java中解析json字符串

    本文将深入探讨如何在Java中解析JSON字符串,以满足后端处理前端传递的数据需求。 首先,理解JSON的基本结构至关重要。JSON格式通常包含键值对,可以是对象(用花括号 `{}` 包裹)或数组(用方括号 `[]` 包裹)。...

    JAVA后台使用JSON用到的JAR

    在本压缩包中包含的"JAVA后台使用JSON用到的JAR"是一系列用于处理JSON的Java库,这些库对于Java开发者来说是不可或缺的工具。 1. **Jackson** Jackson是Java中最常用的JSON库之一,由 FasterXML 维护。它提供了...

    jackson-jaxrs-json-provider-2.7.8-API文档-中文版.zip

    标签:fasterxml、jackson、jaxrs、json、provider、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释...

    java中json处理的使用.doc

    - `DateJsonValueProcessor`:这是自定义的JSON值处理器,用于处理JSON中的日期对象。在JSON序列化和反序列化过程中,日期通常需要特殊处理,因为JSON本身并不直接支持日期类型。`DateUtil`可能是一个自定义的日期...

    java处理JSON数据

    在Java编程语言中,处理JSON(JavaScript Object Notation)数据是一项常见的任务,因为JSON作为一种轻量级的数据...理解这些库的使用方式对于任何Java开发者来说都是至关重要的,特别是在处理Web服务和数据交换时。

    Jackson进行Java对象和Json转换的简单工具

    Jackson为Java对象和Json的转换提供了有效的手段,是Web开发不可缺少的工具

    在JAVA中封装JSON数据

    在Java中,我们可以使用多种库来操作JSON,其中最常用的包括Jackson、Gson和org.json。这里以Jackson为例,介绍如何进行JSON数据的封装: 1. **引入依赖**:在你的项目中,需要添加Jackson的依赖。如果是Maven项目...

    jackson-java对象解析为json

    Jackson是Java领域中广泛使用的库,它主要用于JSON的序列化和反序列化。这个库的强大之处在于它的灵活性、高效性能以及对Java对象模型的深度支持。在本文中,我们将深入探讨Jackson如何将Java对象解析为JSON,以及...

    JAVA中用到的json包

    - 在处理JSON转换时,可能会遇到如无效的JSON格式、键不存在等问题。因此,理解并适当地处理`JSONException`是必要的。 6. **其他辅助类** - JSON包通常还包括其他辅助类,如`JSONTokener`用于解析JSON字符串,`...

    Java中使用JSON格式数据工具类及使用说明

    本资源“Java中使用JSON格式数据工具类及使用说明”提供了关于如何在Java中处理JSON数据的方法,包括将JSON数据转化为Java对象以及对特殊数据类型的处理,特别是时间格式化。以下是关于这些知识点的详细说明: 1. *...

    java对象映射器(基于jackson将Java对象转为json,或者将json转为Java对象)

    答:我数据库中的主键是使用雪花算法生成的,就是因为用id的位数太多,导致在前台我点击删除/修改按钮后传入到后端的id会缺少精度。(比如本应该是18234736282736、传过去就是18234736282700),可以看到后三位就...

    java 解析 json文件 java 解析 json文件

    Java解析JSON文件是Java开发中常见的一项任务,特别是在与Web服务交互或处理API响应时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁和易于阅读及编写的特点,被广泛应用于网络数据传输...

    java处理JSON格式数据的通用类

    【Java处理JSON格式数据的通用类】是一种在Java中处理JSON数据的标准方法,它能够方便地接收和返回JSON数据,解决开发过程中与JSON交互的问题。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛...

    Java中使用Json的net.sf.json包

    在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛用于前后端数据传输。...以上内容涵盖了在Java中使用net.sf.json包处理JSON数据的核心知识,希望对你在实际开发中有所帮助。

    Jackson 框架,轻易转换JSON

    - **类型安全的POJO操作**:Jackson允许你在不暴露具体类型的接口中使用泛型,通过`TypeReference`或`JavaType`构建类型信息。 在源码层面,Jackson框架的设计遵循了分层架构,包括输入流解析层、抽象模型层和输出...

    JJSchema, 使用Jackson从Java类型到JSON模式的生成器.zip

    JJSchema, 使用Jackson从Java类型到JSON模式的生成器 JJSchema一个 Java JSON模式和超模式。 目前,它基于v4草案。 支持 Java 8日期和时间 API 。最新版本&lt;dependency&gt; &lt;groupId&gt;com.github

Global site tag (gtag.js) - Google Analytics