JackSon学习笔记(一)

SpringBoot升级/指定jackson版本 【漏洞通告】 2月19日,NVD发布安全通告披露了jackson-databind由JNDI注入导致的远程代码执行 漏洞(CVE-2020-8840),CVSS评分为9.8 。受影响版本的jackson-databind中由于缺少 某些xbean-reflect/JNDI黑名单类,如org.apache.xbean.propertyeditor.JndiConverter, 可导致攻击者使用JNDI注入的方式实现远程代码执行。目前厂商已发布新版本完成漏洞修复, 请相关用户及时升级进行防护。 由于项目中用 阅读详情

概述

Jackson框架是基于Java平台的一套数据处理工具,被称为“最好的Java Json解析器”。 
Jackson框架包含了3个核心库:streaming,databind,annotations.Jackson还包含了其它数据处理类库,此外不作说明。
Jackson版本: 1.x (目前版本从1.1~1.9)与2.x。1.x与2.x从包的命名上可以看出来,1.x的类库中,包命名以:org.codehaus.jackson.xxx开头,而2.x类库中包命令:com.fastxml.jackson.xxx开头

Jackson Home Page:https://github.com/FasterXML/jackson
Jackson Wiki:http://wiki.fasterxml.com/JacksonHome
Jackson doc: https://github.com/FasterXML/jackson-docs
Jackson Download Page:http://wiki.fasterxml.com/JacksonDownload


准备工作

本文所有程序都基于JDK1.7,依赖jackon的三个核心类库:
jackson-core-2.5.3.jar
jackson-annotations-2.5.3.jar
jackson-databind-2.5.3.jar


Jackson处理Json

Jackson提供了三种可选的Json处理方法:流式API(Streaming API) 、树模型(Tree Model)、数据绑定(Data Binding)。从使用角度来看,比较一下这三种处理Json的方式的特性:

Streaming API:是效率最高的处理方式(开销低、读写速度快,但程序编写复杂度高)
Tree Model:是最灵活的处理方式
Data Binding:是最常用的处理方式

下面我们通过例子程序分别使用DataBinding,TreeModel,Streaming的方式来创建和解析Json字符串

1.DataBinding处理Json

Jackson支持Java对象与Json之间的相互转化。java对象序列化为json字符串,json字符串也可以反序列化为相同的java对象。

(1)java对象转化成json:
Province.java
package com.jackson.json.databinding;

public class Province {
	public String name;
	public int population;
	public String[] city;	
}
Country.java
package com.jackson.json.databinding;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Country {
	// 注意:被序列化的bean的private属性字段需要创建getter方法或者属性字段应该为public
	private String country_id;
	private Date birthDate;
	private List<String> nation = new ArrayList<String>();
	private String[] lakes;
	private List<Province> provinces = new ArrayList<Province>();
	private Map<String, Integer> traffic = new HashMap<String, Integer>();

	public Country() {
		// TODO Auto-generated constructor stub
	}

	public Country(String countryId) {
		this.country_id = countryId;
	}

	public String getCountry_id() {
		return country_id;
	}

	public void setCountry_id(String country_id) {
		this.country_id = country_id;
	}

	public Date getBirthDate() {
		return birthDate;
	}

	public void setBirthDate(Date birthDate) {
		this.birthDate = birthDate;
	}

	public List<String> getNation() {
		return nation;
	}

	public void setNation(List<String> nation) {
		this.nation = nation;
	}

	public String[] getLakes() {
		return lakes;
	}

	public void setLakes(String[] lakes) {
		this.lakes = lakes;
	}

	public Integer get(String key) {
		return traffic.get(key);
	}

	public Map<String, Integer> getTraffic() {
		return traffic;
	}

	public void setTraffic(Map<String, Integer> traffic) {
		this.traffic = traffic;
	}

	public void addTraffic(String key, Integer value) {
		traffic.put(key, value);
	}

	public List<Province> getProvinces() {
		return provinces;
	}

	public void setProvinces(List<Province> provinces) {
		this.provinces = provinces;
	}

	@Override
	public String toString() {
		return "Country [country_id=" + country_id + ", birthDate=" + birthDate
				+ ", nation=" + nation + ", lakes=" + Arrays.toString(lakes)
				+ ", province=" + provinces + ", traffic=" + traffic + "]";
	}

}
JavaBeanSerializeToJson.java
package com.jackson.json.databinding;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class JavaBeanSerializeToJson {

	public static void convert() throws Exception {
		// 使用ObjectMapper来转化对象为Json
		ObjectMapper mapper = new ObjectMapper();
		// 添加功能,让时间格式更具有可读性
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		mapper.setDateFormat(dateFormat);

		Country country = new Country("China");
		country.setBirthDate(dateFormat.parse("1949-10-01"));
		country.setLakes(new String[] { "Qinghai Lake", "Poyang Lake",
				"Dongting Lake", "Taihu Lake" });

		List<String> nation = new ArrayList<String>();
		nation.add("Han");
		nation.add("Meng");
		nation.add("Hui");
		nation.add("WeiWuEr");
		nation.add("Zang");
		country.setNation(nation);

		Province province = new Province();
		province.name = "Shanxi";
		province.population = 37751200;
		Province province2 = new Province();
		province2.name = "ZheJiang";
		province2.population = 55080000;
		List<Province> provinces = new ArrayList<Province>();
		provinces.add(province);
		provinces.add(province2);
		country.setProvinces(provinces);
		
		country.addTraffic("Train(KM)", 112000);
		country.addTraffic("HighWay(KM)", 4240000);
		// 为了使JSON视觉上的可读性,增加一行如下代码,注意,在生产中不需要这样,因为这样会增大Json的内容
		mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
		// 配置mapper忽略空属性
		mapper.setSerializationInclusion(Include.NON_EMPTY);
		// 默认情况,Jackson使用Java属性字段名称作为 Json的属性名称,也可以使用Jackson annotations(注解)改变Json属性名称
		mapper.writeValue(new File("country.json"), country);
	}

	public static void main(String[] args) throws Exception {
		convert();
	}

}
程序运行后生成country.json,内容如下:
{
  "country_id" : "China",
  "birthDate" : "1949-10-01",
  "nation" : [ "Han", "Meng", "Hui", "WeiWuEr", "Zang" ],
  "lakes" : [ "Qinghai Lake", "Poyang Lake", "Dongting Lake", "Taihu Lake" ],
  "provinces" : [ {
    "name" : "Shanxi",
    "population" : 37751200
  }, {
    "name" : "ZheJiang",
    "population" : 55080000
  } ],
  "traffic" : {
    "HighWay(KM)" : 4240000,
    "Train(KM)" : 112000
  }
}

(2)Json字符串反序列化为java对象:
package com.jackson.json.databinding;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.List;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 将Json字符串反序列化为Java对象
 */
public class JsonDeserializeToJava {
	
	public static void main(String[] args) throws Exception {
		//ObjectMapper类用序列化与反序列化映射器
		ObjectMapper mapper = new ObjectMapper();
		File json = new File("country.json");
		//当反序列化json时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,
		//因为,例如json里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略
		mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
		
		//从json映射到java对象,得到country对象后就可以遍历查找,下面遍历部分内容,能说明问题就可以了
		Country country = mapper.readValue(json, Country.class);
		System.out.println("country_id:"+country.getCountry_id());
		//设置时间格式,便于阅读
		SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
		String birthDate = dateformat.format(country.getBirthDate());
		System.out.println("birthDate:"+birthDate);
		
		List<Province> provinces = country.getProvinces();
		for (Province province : provinces) {
			System.out.println("province:"+province.name + "\n" + "population:"+province.population);
		}
	}
}
程序运行结果:
country_id:China
birthDate:1949-10-01
province:Shanxi
population:37751200
province:ZheJiang
population:55080000

2.Tree Model处理Json

(1)tree model生成json:

package com.jackson.json.treemodel;

import java.io.File;
import java.io.FileWriter;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class SerializationExampleTreeModel {
	
	public static void main(String[] args) throws Exception {
		//创建一个节点工厂,为我们提供所有节点
		JsonNodeFactory factory = new JsonNodeFactory(false);
		//创建一个json factory来写tree modle为json
		JsonFactory jsonFactory = new JsonFactory();
		//创建一个json生成器
		JsonGenerator generator = jsonFactory.createGenerator(new FileWriter(new File("country2.json")));
		//注意,默认情况下对象映射器不会指定根节点,下面设根节点为country
		ObjectMapper mapper = new ObjectMapper();
		ObjectNode country = factory.objectNode();
		
		country.put("country_id", "China");
		country.put("birthDate", "1949-10-01");
		
		//在Java中,List和Array转化为json后对应的格式符号都是"obj:[]"
		ArrayNode nation = factory.arrayNode();
		nation.add("Han").add("Meng").add("Hui").add("WeiWuEr").add("Zang");
		country.set("nation", nation);
		
		ArrayNode lakes = factory.arrayNode();
		lakes.add("QingHai Lake").add("Poyang Lake").add("Dongting Lake").add("Taihu Lake");
		country.set("lakes", lakes);
		
		ArrayNode provinces = factory.arrayNode();
		ObjectNode province = factory.objectNode();
		ObjectNode province2 = factory.objectNode();
		province.put("name","Shanxi");
		province.put("population", 37751200);
		province2.put("name","ZheJiang");
		province2.put("population", 55080000);
		provinces.add(province).add(province2);
		country.set("provinces", provinces);
		
		ObjectNode traffic = factory.objectNode();
		traffic.put("HighWay(KM)", 4240000);
		traffic.put("Train(KM)", 112000);
		country.set("traffic", traffic);
		
		mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
		mapper.writeTree(generator, country);
	}

}

程序运行生成country2.json,内容如下:

{"country_id":"China","birthDate":"1949-10-01","nation":["Han","Meng","Hui","WeiWuEr","Zang"],"lakes":["QingHai Lake","Poyang Lake","Dongting Lake","Taihu Lake"],"provinces":[{"name":"Shanxi","population":37751200},{"name":"ZheJiang","population":55080000}],"traffic":{"HighWay(KM)":4240000,"Train(KM)":112000}}

(2) json字符串反序列化为tree mode

DeserializationExampleTreeModel1.java,请注意观察程序中不同的JsonNode的类型变化

package com.jackson.json.treemodel;

import java.io.File;
import java.util.Iterator;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class DeserializationExampleTreeModel1 {

	public static void main(String[] args) throws Exception {
		ObjectMapper mapper = new ObjectMapper();
		// Jackson提供一个树节点被称为"JsonNode",ObjectMapper提供方法来读json作为树的JsonNode根节点
		JsonNode node = mapper.readTree(new File("country2.json"));
		// 看看根节点的类型
		System.out.println("node JsonNodeType:"+node.getNodeType());
		// 是不是一个容器
		System.out.println("node is container Node ? "+node.isContainerNode());
		// 得到所有node节点的子节点名称
		System.out.println("---------得到所有node节点的子节点名称-------------------------");
		Iterator<String> fieldNames = node.fieldNames();
		while (fieldNames.hasNext()) {
			String fieldName = fieldNames.next();
			System.out.print(fieldName+" ");
		}
		System.out.println("\n-----------------------------------------------------");
		// as.Text的作用是有值返回值,无值返回空字符串
		JsonNode country_id = node.get("country_id");
		System.out.println("country_id:"+country_id.asText() + " JsonNodeType:"+country_id.getNodeType());
		
		JsonNode birthDate = node.get("birthDate");
		System.out.println("birthDate:"+birthDate.asText()+" JsonNodeType:"+birthDate.getNodeType());
		
		JsonNode nation = node.get("nation");
		System.out.println("nation:"+ nation+ " JsonNodeType:"+nation.getNodeType());
		
		JsonNode lakes = node.get("lakes");
		System.out.println("lakes:"+lakes+" JsonNodeType:"+lakes.getNodeType());

		JsonNode provinces = node.get("provinces");
		System.out.println("provinces JsonNodeType:"+provinces.getNodeType());

		boolean flag = true;
		for (JsonNode provinceElements : provinces) {
			//为了避免provinceElements多次打印,用flag控制打印,能体现provinceElements的JsonNodeType就可以了
			if(flag){
				System.out.println("provinceElements JsonNodeType:"+provinceElements.getNodeType());
				System.out.println("provinceElements is container node? "+provinceElements.isContainerNode());
				flag = false;
			}
			Iterator<String> provinceElementFields = provinceElements.fieldNames();
			while (provinceElementFields.hasNext()) {
				String fieldName = (String) provinceElementFields.next();
				String province;
				if ("population".equals(fieldName)) {
					province = fieldName + ":" + provinceElements.get(fieldName).asInt();
				}else{
					province = fieldName + ":" + provinceElements.get(fieldName).asText();
				}
				System.out.println(province);
			}
		}
	}
}

程序运行后打印结果如下:

node JsonNodeType:OBJECT
node is container Node ? true
---------得到所有node节点的子节点名称-------------------------
country_id birthDate nation lakes provinces traffic 
-----------------------------------------------------
country_id:China JsonNodeType:STRING
birthDate:1949-10-01 JsonNodeType:STRING
nation:["Han","Meng","Hui","WeiWuEr","Zang"] JsonNodeType:ARRAY
lakes:["QingHai Lake","Poyang Lake","Dongting Lake","Taihu Lake"] JsonNodeType:ARRAY
provinces JsonNodeType:ARRAY
provinceElements JsonNodeType:OBJECT
provinceElements is container node? true
name:Shanxi
population:37751200
name:ZheJiang
population:55080000


在来看一下DeserializationExampleTreeModel2.java,本例中使用JsonNode.path的方法,path方法类似于DeserializationExampleTreeModel1.java中使用的get方法,

但当node不存在时,get方法返回null,而path返回MISSING类型的JsonNode

package com.jackson.json.treemodel;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class DeserializationExampleTreeModle2 {
	
	public static void main(String[] args) throws JsonProcessingException, IOException{
		ObjectMapper mapper = new ObjectMapper();
		JsonNode node = mapper.readTree(new File("country2.json"));
		//path方法获取JsonNode时,当对象不存在时,返回MISSING类型的JsonNode
		JsonNode missingNode = node.path("test");
		if(missingNode.isMissingNode()){
			System.out.println("JsonNodeType : " + missingNode.getNodeType());
		}

		System.out.println("country_id:"+node.path("country_id").asText());
		
		JsonNode provinces = node.path("provinces");
		for (JsonNode provinceElements : provinces) {
			Iterator<String> provincesFields = provinceElements.fieldNames();
			while (provincesFields.hasNext()) {
				String fieldName = (String) provincesFields.next();
				String province;
				if("name".equals(fieldName)){
					province = fieldName +":"+ provinceElements.path(fieldName).asText();
				}else{
					province = fieldName +":"+ provinceElements.path(fieldName).asInt();
				}
				System.out.println(province);
			}
		}
	}

}
程序运行打印结果:
JsonNodeType : MISSING
country_id:China
name:Shanxi
population:37751200
name:ZheJiang
population:55080000

3.Stream处理Json

(1)stream生成json

package com.jackson.json.streaming;

import java.io.File;
import java.io.FileWriter;
import java.io.Exception;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;

public class StreamGeneratorJson {
	
	public static void main(String[] args) throws Exception {
		JsonFactory factory = new JsonFactory();
		//从JsonFactory创建一个JsonGenerator生成器的实例
		JsonGenerator generator = factory.createGenerator(new FileWriter(new File("country3.json")));
		
		generator.writeStartObject();
		generator.writeFieldName("country_id");
		generator.writeString("China");
		generator.writeFieldName("provinces");
		generator.writeStartArray();
		generator.writeStartObject();
		generator.writeStringField("name", "Shanxi");
		generator.writeNumberField("population", 33750000);
		generator.writeEndObject();
		generator.writeEndArray();
		generator.writeEndObject();
		
		generator.close();
	}

}
程序运行后生成country3.json文件内容:
{"country_id":"China","provinces":[{"name":"Shanxi","population":33750000}]}

(2)stream解析json:
现在adgcountry3.json,我们用Streaming API的方式来解析上面的Json,并查找json中population的值。
package com.jackson.json.streaming;

import java.io.File;
import java.io.IOException;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

/*Jackson API提供了token对每个Json对象,例如,Json开始符号“{”是token指向的第一个解析的对象,
 key:value键值对是另一个单独的对象。这个API很强大,但也需要编写大量代码。不推荐使用,平时更多的是使用DataBinding和TreeModel来处理json
 */
public class StreamParserJson {
	public static void main(String[] args) throws JsonParseException,
			IOException {
		JsonFactory factory = new JsonFactory();
		// 从JsonFactory创建JsonParser解析器的实例
		JsonParser parser = factory.createParser(new File("country3.json"));

		while (!parser.isClosed()) {
			// 得到一个token,第一次遍历时,token指向json文件中第一个符号"{"
			JsonToken token = parser.nextToken();
			if (token == null) {
				break;
			}
			// 我们只查找 country3.json中的"population"字段的值,能体现解析的流程就可以了
			// 当key是provinces时,我们进入provinces,查找population
			if (JsonToken.FIELD_NAME.equals(token)
					&& "provinces".equals(parser.getCurrentName())) {
				token = parser.nextToken();
				if (!JsonToken.START_ARRAY.equals(token)) {
					break;
				}
				// 此时,token指向的应该是"{"
				token = parser.nextToken();
				if (!JsonToken.START_OBJECT.equals(token)) {
					break;
				}
				while (true) {
					token = parser.nextToken();
					if (token == null) {
						break;
					}
					if (JsonToken.FIELD_NAME.equals(token)
							&& "population".equals(parser.getCurrentName())) {
						token = parser.nextToken();
						System.out.println(parser.getCurrentName() + " : "
								+ parser.getIntValue());
					}
				}
			}
		}
	}

}
程序运行后,在控制台打印结果如下:
population : 33750000

总结

上面的例子中,分别用3种方式处理Json,我的体会大致如下:

Stream API方式是开销最低、效率最高,但编写代码复杂度也最高,在生成Json时,需要逐步编写符号和字段拼接json,在解析Json时,需要根据token指向也查找json值,生成和解析json都不是很方便,代码可读性也很低。
Databinding处理Json是最常用的json处理方式,生成json时,创建相关的java对象,并根据json内容结构把java对象组装起来,最后调用writeValue方法即可生成json,
解析时,就更简单了,直接把json映射到相关的java对象,然后就可以遍历java对象来获取值了。
TreeModel处理Json,是以树型结构来生成和解析json,生成json时,根据json内容结构,我们创建不同类型的节点对象,组装这些节点生成json。解析json时,它不需要绑定json到java bean,根据json结构,使用path或get方法轻松查找内容。

学习参考: http://www.cnblogs.com/lee0oo0/articles/2652528.html
SpringBoot使用Jackson【最全版】 概述:Springboot配置JackSon处理类属性,JavaBean序列化为JSON格式,常用框架:阿里fastjson,谷歌gson、Jackson等。① 性能:Jackson > Fastjson > Gson >同个结构② Jackson、Fastjson、Gson 类库各有特点,各有自己的专长Jackson是spring-boot-starter-json依赖的一部分,spring-boot-starter-web中包含spring-boot-starter-json。 阅读详情

相关推荐

Java必知必会系列:XML与JSON处理技术

作者:禅与计算机程序设计艺术 1.背景介绍 在互联网的应用快速发展、大数据量的爆发、移动终端的普及和物联网设备的火热应用下,传统的基于文本的通信协议越来越被遗忘。由于历史遗留问题,XML(eXtensible Markup Language)仍然被广泛运用,但随着HTML5的出现,Web前端技术出现

AI天才研究院 361

FasterXML Jackson

本篇文章参考于简书:https://www.jianshu.com/p/4bd355715419,在此基础上验证并稍作修改。 老版本的Jackson使用的包名为org.codehaus.jackson,而新版本使用的是com.fasterxml.jackson。 Jackson主要包含了3个模块: jackson-core jackson-annotations jackson-d...

二苟 7695

[享学Jackson] 一、初识Jackson -- 世界上最好的JSON库

首个付费专栏,你懂的。

架构师:通透,才能写出好代码! 2万+

fasterxml jaskson的使用

fasterxml-jackson解析json格式数据的探索

majinshanNUN的博客 4810

jackson-dataformat-xml-2.12.2-API文档-中英对照版.zip

赠送jar包:jackson-dataformat-xml-2.12.2.jar; 赠送原API文档:jackson-dataformat-xml-2.12.2-javadoc.jar; 赠送源代码:jackson-dataformat-xml-2.12.2-sources.jar; 赠送Maven依赖信息文件:jackson-dataformat-xml-2.12.2.pom; 包含翻译后的API文档:jackson-dataformat-xml-2.12.2-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.12.2; 标签:fasterxml、jackson、dataformat、xml、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

最全卷积总结篇(分组、深度可分离、空洞、转置等)

分组卷积(Group Convolution)是一种卷积操作方式,它最早在AlexNet中引入,并在深度学习中被广泛使用,尤其是在高效模型设计(如MobileNet和ResNeXt)中。分组卷积通过将输入特征通道分为若干组,并在每组内单独进行卷积操作,可以减少计算复杂度和参数量,同时有效利用模型的结构特性。分组卷积的工作原理通道分组:输入特征图的通道图为C_in,输出特征图的通道数为C_out,将每组的C_in和C_out分为G组,每组的通道数为C_in/G和C_out/G。组内卷积。

qq_44815135的博客 4218

Jackson学习笔记(一)Jackson解析Json

初识Jackson 导入jar文件: jackson-annotations-2.9.9.jar jackson-core-2.9.9.jar jackson-databind-2.9.9.jar 一、Jackson简介 1、Jackson Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml...

Vaingloryss的博客 3048

从车机到广告屏:CS5523芯片在5大显示场景的应用方案全解析

本文全面解析了CS5523芯片在车载显示、数字广告机、医疗设备和工业HMI等五大场景的应用方案。作为高性能MIPI转eDP芯片,CS5523凭借出色的兼容性和低功耗特性,成为国产替代方案的优选。文章详细介绍了芯片架构、核心技术及实际应用中的设计要点,为工程师提供全面的技术参考。

julia4scientist的博客 902

Jackson学习笔记(一)

概述 Jackson框架是基于Java平台的一套数据处理工具,被称为“最好的Java Json解析器”。  Jackson框架包含了3个核心库:streaming,databind,annotations.Jackson还包含了其它数据处理类库,此外不作说明。 Jackson版本: 1.x (目前版本从1.1~1.9)与2.x。1.x与2.x从包的命名上可以看出来,1.x的类库中,包命名

WheroJ的专栏 1062

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

m0_45877477的博客 1630

PCIe ATS介绍

主机侧使用IOMMU完成设备地址到物理memory地址的转换,以及设备访问权限的检查。但如果所有PCIe设备都在进行DMA操作,则TA(Translation Agent)和ATPT(Address Translation and Protection Table)则会成为瓶颈,从而影响系统的latency。

maxwell2ic的博客 6021

Json工具(一)- Jackson

Jackson是常用的高效安全的Json序列化和反序列化框架。Spring MVC 默认的 json 解析器是 Jackson。

pig_Struggle的博客 1074

C8T6和ZET6选型更换过程中出现.\Obj\Project.sct(7): error: L6235E: More than one section matches selector - cann

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、问题原因二、解决方法三、现象总结 前言 又一件离谱的事情发生了,我之前转换过程中没有发生的错误,今天拿出来程序重新编译了一下,结果他奶奶滴一个新的错误出现了,而且我还完全不知道是什么原因导致的,先上图: 一、问题原因 之前我已经尝试过更换芯片选型,但是没有出现此类问题,今天更改的时候发现了,我还以为是个偶然错误,结果换来换去,还是有这个问题,那我之前说c8t6的程序更改成zet6上跑只需改芯片选型和宏定义岂不是啪啪打.

wx18045623090的博客 1489

Jackson 学习笔记

Jackson 学习笔记语法JSON 转 POJOPOJO 转 JSONJSON 转 listlist 转 JSON手动构建json对象at 按路径取直接目标值取值转类型注解参考资料 语法 com.fasterxml.jackson.databind.ObjectMapper ObjectMapper mapper; 不要每次都new如果在Spring中直接注入使用。 JsonNode不能put可以强转objectNode后操作。 objectNode添加内容时。基础类型、包装类用 put,自定义对象用s

灵台方寸山斜月三星洞 2392

【PostgreSQL教程】PostgreSQL 高级篇之子查询

子查询也可称为内部查询、嵌套查询,指的是在 PostgreSQL 查询中的 WHERE 子句中嵌入查询语句。一个 SELECT 语句的查询结果能够作为另一个语句的输入值。子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,并可使用运算符如 =、、>=、

No8g攻城狮的博客 1206

多智能体系统在军事仿真中的应用:AI人工智能战略推演

本文旨在全面解析多智能体系统在军事仿真领域的应用技术,重点探讨AI驱动的战略推演系统的设计原理和实现方法。研究范围涵盖从基础理论到实际应用的完整技术栈。本文采用从理论到实践的递进结构,首先介绍核心概念,然后深入算法实现,最后展示实际应用案例和未来展望。多智能体系统(MAS):由多个相互作用的智能体组成的分布式系统军事仿真(Military Simulation):通过计算机模拟军事行动和战争场景战略推演(Strategic Wargaming):通过模拟推演评估军事战略的有效性更高保真度的仿真。

AI天才研究院 1777

Jackson介绍及使用

Jackson 于 2009 年 5 月首次正式发布,旨在满足快速、正确和轻量级三大宗旨。Jackson 是一个成熟稳定的库,它提供了多种不同的方法来处理 JSON,包括在一些简单的用例中使用注释。Jackson 提供了三个核心模块。) 定义了一个低级流式 API 并包括特定于 JSON 的实现。) 包含标准的 Jackson 注释。Databind() 实现数据绑定和对象序列化。将databind模块添加到项目中还会将流式处理和注释模块添加为传递依赖项。下面的示例将重点关注这些核心模块;

西凉的悲伤博客 5383

uniapp - 超详细的 H5 公众号网页微信登录示例代码,提供从 0-1 公众号配置及详细注释代码(站在新手小白的角度)第三方微信授权登录的实现!!

uniapp微信浏览器H5授权微信登录,UniApp开发H5接入微信登录的全过程,uniapp的H5页面使用微信登录,uniapp H5微信授权登录,H5之微信授权登陆 (uniapp网页版微信授权登录),uni-app开发H5第三方微信授权登录的实现,uniapp如何实现微信授权登录,公众号H5页面接入微信登录流程,uni-app - 最详细 H5 网页接入微信登录功能,提供公众号配置与详细注释示例代码(移动端网页实现点击登录按钮后 调用微信公众号授权登录功能 详细讲解接入流程与详细示例代码)官方最新超级

✅ 精选推荐文章 1万+

SpringBoot使用Jackson

Springboot配置JackSon处理类属性,JavaBean序列化为JSON格式,常用框架:阿里fastjson,谷歌gson、Jackson等。① 性能:Jackson > Fastjson > Gson >同个结构② Jackson、Fastjson、Gson 类库各有特点,各有自己的专长Jackson是spring-boot-starter-json依赖的一部分,spring-boot-starter-web中包含spring-boot-starter-json。也就是说当项目中引入了。

username00000的博客 1309

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Jackson学习笔记

Jackson学习笔记 前言 jackson-databind 依赖 jackson-core 和 jackson-annotations ,所以只需要依赖 jackson-databind 即可 版本说明 jackson-databind=2.11.2 相关链接: jackson-databind maven 地址:https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind jackson githu

SIMBA1949的博客 1109

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

SpringMVC -> 使用jackson将对象转化为json对象,jackson工具类

方法一:创建jackson对象,调用方法转化为json 对象 @ResponseBody @RequestMapping("/user1") public String user1() throws JsonProcessingException { //创建一个jackson对象,用来解析数据 ObjectMapper mapper = new ObjectMapper(); User user = new User(11, "rod", 22); //使用wr

rod0320的博客 7094

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 中国iOS应用开发者:仅少数盈利 较难脱颖而出
下一篇: Jackson学习笔记(三)
java_huashan
博客等级 码龄14年 37粉丝 12原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值