json解析工具类
对jackson的ObjectMapper的封装:
ObjectMapperUtils:
import static com.fasterxml.jackson.core.JsonFactory.Feature.INTERN_FIELD_NAMES;
import static com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_COMMENTS;
import static com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
import static com.fasterxml.jackson.databind.type.TypeFactory.defaultInstance; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Map; import javax.annotation.Nullable; import org.apache.commons.lang3.StringUtils; import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.guava.GuavaModule;
import com.fasterxml.jackson.module.kotlin.KotlinModule;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import com.hubspot.jackson.datatype.protobuf.ProtobufModule; public final class ObjectMapperUtils { private static final String EMPTY_JSON = "{}"; private static final String EMPTY_ARRAY_JSON = "[]"; /**
* disable INTERN_FIELD_NAMES, 解决GC压力大、内存泄露的问题
*/
private static final ObjectMapper MAPPER = new ObjectMapper(new JsonFactory().disable(INTERN_FIELD_NAMES))
.registerModule(new GuavaModule()); static {
MAPPER.disable(FAIL_ON_UNKNOWN_PROPERTIES);
MAPPER.enable(ALLOW_UNQUOTED_CONTROL_CHARS);
MAPPER.enable(ALLOW_COMMENTS);
MAPPER.registerModule(new ParameterNamesModule());
MAPPER.registerModule(new KotlinModule());
MAPPER.registerModule(new ProtobufModule());
} public static String toJSON(@Nullable Object obj) {
if (obj == null) {
return null;
}
try {
return MAPPER.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
} /**
* 输出格式化好的json
* 请不要在输出log时使用
* <p>
* 一般只用于写结构化数据到ZooKeeper时使用(为了更好的可读性)
*/
public static String toPrettyJson(@Nullable Object obj) {
if (obj == null) {
return null;
}
try {
return MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
} public static void toJSON(@Nullable Object obj, OutputStream writer) {
if (obj == null) {
return;
}
try {
MAPPER.writeValue(writer, obj);
} catch (IOException e) {
throw new RuntimeException(e);
}
} public static <T> T fromJSON(@Nullable byte[] bytes, Class<T> valueType) {
if (bytes == null) {
return null;
}
try {
return MAPPER.readValue(bytes, valueType);
} catch (IOException e) {
throw new RuntimeException(e);
}
} public static <T> T fromJSON(@Nullable String json, Class<T> valueType) {
if (json == null) {
return null;
}
try {
return MAPPER.readValue(json, valueType);
} catch (IOException e) {
throw new RuntimeException(e);
}
} public static <T> T fromJSON(Object value, Class<T> valueType) {
if (value == null) {
return null;
} else if (value instanceof String) {
return fromJSON((String) value, valueType);
} else if (value instanceof byte[]) {
return fromJSON((byte[]) value, valueType);
} else {
return null;
}
} public static <T> T value(Object rawValue, Class<T> type) {
return MAPPER.convertValue(rawValue, type);
} public static <T> T update(T rawValue, String newProperty) {
try {
return MAPPER.readerForUpdating(rawValue).readValue(newProperty);
} catch (IOException e) {
throw new RuntimeException(e);
}
} public static <T> T value(Object rawValue, TypeReference<T> type) {
return MAPPER.convertValue(rawValue, type);
} public static <T> T value(Object rawValue, JavaType type) {
return MAPPER.convertValue(rawValue, type);
} public static <T> T unwrapJsonP(String raw, Class<T> type) {
return fromJSON(unwrapJsonP(raw), type);
} private static String unwrapJsonP(String raw) {
raw = StringUtils.trim(raw);
raw = StringUtils.removeEnd(raw, ";");
raw = raw.substring(raw.indexOf('(') + 1);
raw = raw.substring(0, raw.lastIndexOf(')'));
raw = StringUtils.trim(raw);
return raw;
} public static <E, T extends Collection<E>> T fromJSON(String json,
Class<? extends Collection> collectionType, Class<E> valueType) {
if (StringUtils.isEmpty(json)) {
json = EMPTY_ARRAY_JSON;
}
try {
return MAPPER.readValue(json,
defaultInstance().constructCollectionType(collectionType, valueType));
} catch (IOException e) {
throw new RuntimeException(e);
}
} /**
* use {@link #fromJson(String)} instead
*/
public static <K, V, T extends Map<K, V>> T fromJSON(String json, Class<? extends Map> mapType,
Class<K> keyType, Class<V> valueType) {
if (StringUtils.isEmpty(json)) {
json = EMPTY_JSON;
}
try {
return MAPPER.readValue(json,
defaultInstance().constructMapType(mapType, keyType, valueType));
} catch (IOException e) {
throw new RuntimeException(e);
}
} public static <T> T fromJSON(InputStream inputStream, Class<T> type) {
try {
return MAPPER.readValue(inputStream, type);
} catch (IOException e) {
throw new RuntimeException(e);
}
} public static <E, T extends Collection<E>> T fromJSON(byte[] bytes,
Class<? extends Collection> collectionType, Class<E> valueType) {
try {
return MAPPER.readValue(bytes,
defaultInstance().constructCollectionType(collectionType, valueType));
} catch (IOException e) {
throw new RuntimeException(e);
}
} public static <E, T extends Collection<E>> T fromJSON(InputStream inputStream,
Class<? extends Collection> collectionType, Class<E> valueType) {
try {
return MAPPER.readValue(inputStream,
defaultInstance().constructCollectionType(collectionType, valueType));
} catch (IOException e) {
throw new RuntimeException(e);
}
} public static Map<String, Object> fromJson(InputStream is) {
return fromJSON(is, Map.class, String.class, Object.class);
} public static Map<String, Object> fromJson(String string) {
return fromJSON(string, Map.class, String.class, Object.class);
} public static Map<String, Object> fromJson(byte[] bytes) {
return fromJSON(bytes, Map.class, String.class, Object.class);
} /**
* use {@link #fromJson(byte[])} instead
*/
public static <K, V, T extends Map<K, V>> T fromJSON(byte[] bytes, Class<? extends Map> mapType,
Class<K> keyType, Class<V> valueType) {
try {
return MAPPER.readValue(bytes,
defaultInstance().constructMapType(mapType, keyType, valueType));
} catch (IOException e) {
throw new RuntimeException(e);
}
} /**
* use {@link #fromJson(InputStream)} instead
*/
public static <K, V, T extends Map<K, V>> T fromJSON(InputStream inputStream,
Class<? extends Map> mapType, Class<K> keyType, Class<V> valueType) {
try {
return MAPPER.readValue(inputStream,
defaultInstance().constructMapType(mapType, keyType, valueType));
} catch (IOException e) {
throw new RuntimeException(e);
}
} public static boolean isJSON(String jsonStr) {
if (StringUtils.isBlank(jsonStr)) {
return false;
}
try (JsonParser parser = new ObjectMapper().getFactory().createParser(jsonStr)) {
while (parser.nextToken() != null) {
// do nothing.
}
return true;
} catch (IOException ioe) {
return false;
}
} public static boolean isBadJSON(String jsonStr) {
return !isJSON(jsonStr);
} }
需要依赖的jackson相关的包有:
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-guava -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
<version>2.10.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.hubspot.jackson/jackson-datatype-protobuf -->
<dependency>
<groupId>com.hubspot.jackson</groupId>
<artifactId>jackson-datatype-protobuf</artifactId>
<version>0.9.11-jackson2.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.module/jackson-module-kotlin -->
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<version>2.10.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.module/jackson-module-parameter-names -->
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
<version>2.10.1</version>
</dependency>
json解析工具类的更多相关文章
- 一个强大的json解析工具类
该工具类利用递归原理,能够将任意结构的json字符串进行解析.当然,如果需要解析为对应的实体对象时,就不能用了 package com.wot.cloudsensing.carrotfarm.util ...
- 使用json-lib-*.jar的JSON解析工具类
使用json-lib-2.4-jdk15.jar JSON工具类: import java.util.List; import net.sf.json.JSONArray; import net.sf ...
- 基于json-lib-2.2.2-jdk15.jar的JSON解析工具类大集合
json解析之前的必备工作:导入json解析必须的六个包 资源链接:百度云:链接:https://pan.baidu.com/s/1dAEQQy 密码:1v1z 代码示例: package com.s ...
- Json解析工具Jackson(使用注解)
原文http://blog.csdn.net/nomousewch/article/details/8955796 接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给 ...
- 一个.NET通用JSON解析/构建类的实现(c#)转
转自:http://www.cnblogs.com/xfrog/archive/2010/04/07/1706754.html NET通用JSON解析/构建类的实现(c#) 在.NET Framewo ...
- 自定义Json解析工具
此博客为博主原创文章,转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10689536.html fastjson是很好用的json解析工具,只可惜项目中要 ...
- java后台常用json解析工具问题小结
若排版紊乱可查看我的个人博客原文地址 java后台常用json解析工具问题小结 这里不细究造成这些问题的底层原因,只是单纯的描述我碰到的问题及对应的解决方法 jackson将java对象转json字符 ...
- Java处理JSON的工具类(List、Map和JSON之间的转换)——依赖jsonlib支持Map嵌套
原文链接:http://www.itjhwd.com/java_json/ 代码 package com.itjh.mmp.util; import java.io.BufferedReader; i ...
- Jsoup请求http或https返回json字符串工具类
Jsoup请求http或https返回json字符串工具类 所需要的jar包如下: jsoup-1.8.1.jar 依赖jar包如下: httpclient-4.5.4.jar; httpclient ...
随机推荐
- 【PyTorch】计算局部相似矩阵
计算局部相似矩阵 代码文档:https://github.com/lartpang/mypython/blob/master/2019-09-25%E8%AE%A1%E7%AE%97%E5%B1%80 ...
- 【计算机视觉】【图像处理】【VS开发】【Qt开发】opencv之深拷贝及浅拷贝,IplImage装换为Mat
原文:opencv之深拷贝及浅拷贝,IplImage装换为Mat 一.(1) 浅拷贝: Mat B; B = image // 第一种方式 Mat C(image); // 第二种方式 这两种方式称 ...
- C++中利用迭代器删除元素会发生什么?
转自:https://blog.csdn.net/yf_li123/article/details/75003425#comments (1)对于关联容器(如map,set,multimap,mu ...
- spring boot-18.使用dubbo发布分布式服务
我们新建两个项目分别模拟服务的提供者和服务的消费者,spring boot 集成dubbo主要分为以下几个步骤: 1.安装zookeeper 推荐使用docker 安装,使用以下几个命令即可完成 (1 ...
- 国产银河麒麟 安装wps 的简单方法
前提说明 银河麒麟 是总部在天津的企业 有国防科大还有 ubuntu的母公司一起在维护 主要的产品有 优麒麟 还有 银河麒麟 优麒麟 可以看做是 国产版的ubuntu的社区版 银河麒麟 则是 面向国内 ...
- 在子类中,若要调用父类中被覆盖的方法,可以使用super关键字
在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. package text; class Parent { int x; public Parent() { ...
- Spring(九)--通知
Spring之Advice通知 Spring原生的经典模式 实现AOPadvice :通知 前置通知:在目标方法执行之前执行!不能改变方法的执行流程和结果! 实现MethodB ...
- ctrNet库介绍
一个神秘网友写的代码库,膜拜,附上下载链接:https://github.com/guoday/ctrNet-tool 似乎是专门为点击率预估写的库??? 收藏,日后慢慢研究
- PythonError解决方案
# Pip Error pip install * error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visua ...
- 05、解剖CEL文件各版本格式和读取方法(非R语言)
相比DAT文件,网络上更支持CEL级别的文件.CEL已经把DAT图像转换成数据了,而且CEL比DAT所占空间小得多.介绍一下CEL文件的格式,CEL文件有文本文件(TextCelFile,版本3).B ...