java jackson maven,jackson中objectMapper的使用

Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象

ObjectMapper类是Jackson库的主要类。它称为ObjectMapper的原因是因为它将JSON映射到Java对象(反序列化),或将Java对象映射到JSON(序列化)。它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写。

maven 安装

com.fasterxml.jackson.core

jackson-core

2.9.6

com.fasterxml.jackson.core

jackson-annotations

2.9.6

com.fasterxml.jackson.core

jackson-databind

2.9.6

Jackson ObjectMapper如何将JSON字段与Java字段匹配

三种方式

1.Jackson通过将JSON字段的名称与Java对象中的getter和setter方法相匹配,将JSON对象的字段映射到Java对象中的字段。Jackson删除了getter和setter方法名称的“get”和“set”部分,并将剩余名称的第一个字符转换为小写。

2.Jackson还可以通过java反射进行匹配

3.通过注解或者其它方式进行自定义的序列化和反序列化程序。

转Java对象

Read Object From JSON String

ObjectMapper objectMapper = new ObjectMapper();

String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

Car car = objectMapper.readValue(carJson, Car.class);

2.Read Object From JSON Reader

ObjectMapper objectMapper = new ObjectMapper();

String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 4 }";

Reader reader = new StringReader(carJson);

Car car = objectMapper.readValue(reader, Car.class);

3.Read Object From JSON File

ObjectMapper objectMapper = new ObjectMapper();

File file = new File("data/car.json");

Car car = objectMapper.readValue(file, Car.class);

Read Object From JSON via URL

ObjectMapper objectMapper = new ObjectMapper();

URL url = new URL("file:data/car.json");

Car car = objectMapper.readValue(url, Car.class);

本例使用的是文件URL,也可使用一个HTTP URL(如:http://jenkov.com/some-data.json ).

Read Object From JSON InputStream

ObjectMapper objectMapper = new ObjectMapper();

InputStream input = new FileInputStream("data/car.json");

Car car = objectMapper.readValue(input, Car.class);

6.Read Object From JSON Byte Array

ObjectMapper objectMapper = new ObjectMapper();

String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

byte[] bytes = carJson.getBytes("UTF-8");

Car car = objectMapper.readValue(bytes, Car.class);

7.Read Object Array From JSON Array String

String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";

ObjectMapper objectMapper = new ObjectMapper();

Car[] cars2 = objectMapper.readValue(jsonArray, Car[].class);

Read Object List From JSON Array String

String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";

ObjectMapper objectMapper = new ObjectMapper();

List cars1 = objectMapper.readValue(jsonArray, new TypeReference>(){});

Read Map from JSON String

String jsonObject = "{\"brand\":\"ford\", \"doors\":5}";

ObjectMapper objectMapper = new ObjectMapper();

Map jsonMap = objectMapper.readValue(jsonObject,

new TypeReference>(){});

转Json

ObjectMapper write有三个方法

writeValue()

writeValueAsString()

writeValueAsBytes()

ObjectMapper objectMapper = new ObjectMapper();

Car car = new Car();

car.brand = "BMW";

car.doors = 4;

//写到文件中

objectMapper.writeValue( new FileOutputStream("data/output-2.json"), car);

//写到字符串中

String json = objectMapper.writeValueAsString(car);

使用Jackson ObjectMapper读取和写入其他数据格式

使用Jackson可以读取和写入除JSON之外的其他数据格式:

CBOR

MessagePack

YAML

其中这些数据格式比JSON更紧凑,因此在存储时占用的空间更少,并且读取和写入速度比JSON更快。在以下部分中,我将向您展示如何使用Jackson读取和写入其中一些数据格式。

使用Jackson ObjectMapper读写CBOR

CBOR是一种二进制数据格式,它与JSON兼容,但比JSON更紧凑,因此读写速度更快。Jackson ObjectMapper可以像读写JSON一样读写CBOR。为了使用Jackson读取和写入CBOR,您需要为项目添加额外的Maven依赖项。介绍了添加Jackson CBOR Maven依赖关系:

import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.dataformat.cbor.CBORFactory;

public class CborJacksonExample {

public static void main(String[] args) {

ObjectMapper objectMapper = new ObjectMapper(new CBORFactory());

Employee employee = new Employee("John Doe", "john@doe.com");

byte[] cborBytes = null;

try {

cborBytes = objectMapper.writeValueAsBytes(employee);

} catch (JsonProcessingException e) {

e.printStackTrace();

// normally, rethrow exception here - or don't catch it at all.

}

try {

Employee employee2 = objectMapper.readValue(cborBytes, Employee.class);

} catch (IOException e) {

e.printStackTrace();

}

}

}

使用Jackson ObjectMapper读取和编写MessagePack

MessagePack是一种文本数据格式,与JSON兼容,但更紧凑,因此读写速度更快。Jackson ObjectMapper可以像读写JSON一样读写MessagePack。为了使用Jackson读写MessagePack,您需要为项目添加额外的Maven依赖项:

import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.databind.ObjectMapper;

import org.msgpack.jackson.dataformat.MessagePackFactory;

import java.io.IOException;

public class MessagePackJacksonExample {

public static void main(String[] args) {

ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory());

Employee employee = new Employee("John Doe", "john@doe.com");

byte[] messagePackBytes = null;

try {

messagePackBytes = objectMapper.writeValueAsBytes(employee);

} catch (JsonProcessingException e) {

e.printStackTrace();

// normally, rethrow exception here - or don't catch it at all.

}

try {

Employee employee2 = objectMapper.readValue(messagePackBytes, Employee.class);

System.out.println("messagePackBytes = " + messagePackBytes);

} catch (IOException e) {

e.printStackTrace();

}

}

}

使用Jackson ObjectMapper读取和编写YAML

YAML是一种文本数据格式,类似于JSON,但使用不同的语法。Jackson ObjectMapper可以像读写JSON一样读写YAML。为了使用Jackson读取和写入YAML,您需要为项目添加额外的Maven依赖项:

import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;

import java.io.IOException;

public class YamlJacksonExample {

public static void main(String[] args) {

ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());

Employee employee = new Employee("John Doe", "john@doe.com");

String yamlString = null;

try {

yamlString = objectMapper.writeValueAsString(employee);

} catch (JsonProcessingException e) {

e.printStackTrace();

// normally, rethrow exception here - or don't catch it at all.

}

try {

Employee employee2 = objectMapper.readValue(yamlString, Employee.class);

System.out.println("Done");

} catch (IOException e) {

e.printStackTrace();

}

}

}

ObjectMapper的设置

ObjectMapper objectMapper = new ObjectMapper();

//去掉默认的时间戳格式

objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

//设置为东八区

objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));

// 设置输入:禁止把POJO中值为null的字段映射到json字符串中

objectMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);

//空值不序列化

objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

//反序列化时,属性不存在的兼容处理

objectMapper.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

//序列化时,日期的统一格式

objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

//序列化日期时以timestamps输出,默认true

objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

//序列化枚举是以toString()来输出,默认false,即默认以name()来输出

objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING,true);

//序列化枚举是以ordinal()来输出,默认false

objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_INDEX,false);

//类为空时,不要抛异常

objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

//反序列化时,遇到未知属性时是否引起结果失败

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

//单引号处理

objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);

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

objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);

自定义解析器

ObjectMapper 可以通过自定义解析器来定义解析方法

以下是自定义的反序列化的方法

import com.fasterxml.jackson.core.JsonParser;

import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.databind.DeserializationContext;

import com.fasterxml.jackson.databind.JsonDeserializer;

import com.fasterxml.jackson.databind.JsonNode;

import org.springframework.data.geo.Point;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class Point_Fastjson_Deserialize extends JsonDeserializer {

@Override

public Point deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

JsonNode node = jsonParser.getCodec().readTree(jsonParser);

Iterator iterator = node.get("coordinates").elements();

List list = new ArrayList<>();

while (iterator.hasNext()) {

list.add(iterator.next().asDouble());

}

return new Point(list.get(0), list.get(1));

}

}

注册到objectMapper中

ObjectMapper objectMapper = new ObjectMapper();

SimpleModule module = new SimpleModule();

module.addDeserializer(Point.class, new Point_Fastjson_Deserialize());

objectMapper.registerModule(module);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值