1.Json-lib
项目地址:json-lib.sourceforge.net/index.html
json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷, 比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。json-lib在功能和性能上面都不能满足现在互联网化的需求。
Maven 依赖
点击查看代码
| <dependency> |
| <groupId>net.sf.json-lib</groupId> |
| <artifactId>json-lib</artifactId> |
| <version>2.4</version> |
| <classifier>jdk15</classifier> |
| </dependency> |
点击查看代码
| public static void main(String[] args) throws IOException, InterruptedException { |
| String json = ApiService.getApi(); |
| JSONObject jsonObject = JSONObject.fromObject(json); |
| String city = JSONObject.fromObject(jsonObject.get("cityInfo")).get("city").toString(); |
| JSONArray jsonArray = JSONObject.fromObject(jsonObject.get("data")).getJSONArray("forecast"); |
| |
| List<weather> weathers =new ArrayList<>(); |
| System.out.println(jsonArray.size()); |
| for (int i =0;i<jsonArray.size();i++){ |
| |
| weather weather = (weather)JSONObject.toBean((JSONObject) jsonArray.get(i), weather.class); |
| weathers.add(weather); |
| } |
| System.out.println(city); |
| weathers.forEach(e->{ |
| System.out.println(e); |
| }); |
| } |
2.Gson
项目地址:github.com/google/gson
Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。 Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。 在使用这种对象转换之前,需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。 类里面只要有get和set方法,Gson完全可以实现复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Maven 依赖
点击查看代码
| <dependency> |
| <groupId>com.google.code.gson</groupId> |
| <artifactId>gson</artifactId> |
| <version>2.8.6</version> |
| </dependency> |
点击查看代码
| public static void main(String[] args) throws IOException, InterruptedException { |
| Gson gson = new Gson(); |
| List<weather> json = ApiService.GetList(); |
| String toJson = gson.toJson(json); |
| System.out.println("List转json:"+toJson); |
| List<weather> weathers=gson.fromJson(toJson, new TypeToken<List<weather>>() {}.getType()); |
| |
| System.out.println("json转List:"+weathers); |
| |
| } |
3.FastJson
项目地址:github.com/alibaba/fas…
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
关于FastJson漏洞
fastjson 当前版本为 1.2.68 发布于 3 月底,日前某安全运营中心监测到,fastjson <= 1.2.68 版本存在远程代码执行漏洞,漏洞被利用可直接获取服务器权限。360CERT 将漏洞等级定为“高危 Maven 依赖
点击查看代码
| <dependency> |
| <groupId>com.alibaba</groupId> |
| <artifactId>fastjson</artifactId> |
| <version>1.2.72</version> |
| </dependency> |
点击查看代码
| public class FastJson { |
| public static void main(String[] args) throws IOException, InterruptedException { |
| String json = ApiService.getApi(); |
| JSONObject jsonObject = JSONObject.parseObject(json); |
| Object data = jsonObject.get("data"); |
| String toJSONString = JSON.toJSONString(data); |
| JSONArray jsonArray = JSONObject.parseObject(toJSONString).getJSONArray("forecast"); |
| List<weather> weathers = JSON.parseArray(JSON.toJSONString(jsonArray), weather.class); |
| weathers.forEach(o->{ |
| System.out.println(o); |
| }); |
| |
| |
| } |
| } |
4.Jackson
项目地址:github.com/FasterXML/j…
Jackson是当前用的比较广泛的,用来序列化和反序列化json的Java开源框架。Jackson社区相对比较活跃,更新速度也比较快, 从Github中的统计来看,Jackson是最流行的json解析器之一,Spring MVC的默认json解析器便是Jackson。
Jackson优点很多:
Jackson 所依赖的jar包较少,简单易用。
与其他 Java 的 json 的框架 Gson 等相比,Jackson 解析大的 json 文件速度比较快。
Jackson 运行时占用内存比较低,性能比较好
Jackson 有灵活的 API,可以很容易进行扩展和定制。
Jackson 是spring推荐的json解析工具,拥有强大的注解
常用注解
@JsonProperty: 属性使用的注解,用来表示外部属性名字,就是使用别名序列化,而不是对象的
@JsonAutoDetect: 实体类使用的注解,用于重新设置实体类中属性的自动发现机制。
@JsonFormat: 实体类/属性使用的注解,在序列化或者反序列化的时候,指定属性格式化日期/时间。
Maven 依赖
点击查看代码
| <dependency> |
| <groupId>com.fasterxml.jackson.core</groupId> |
| <artifactId>jackson-core</artifactId> |
| <version>2.9.8</version> |
| </dependency> |
| <dependency> |
| <groupId>com.fasterxml.jackson.core</groupId> |
| <artifactId>jackson-databind</artifactId> |
| <version>2.10.2</version> |
| </dependency> |
点击查看代码
| public class JackJson { |
| public static void main(String[] args) throws IOException, InterruptedException { |
| |
| List<weather> json = ApiService.GetList(); |
| weather weather = json.get(0); |
| System.out.println("对象转json:"+JsonUtils.toJsonWithDefaultPrettyPrinter(weather)); |
| Map<String,Object> map =new HashMap<>(); |
| map.put("1","上海"); |
| map.put("2","北京"); |
| map.put("3","天津"); |
| map.put("4","深圳"); |
| Map<String,Object> map1 =new HashMap<>(); |
| map1.put("city",map); |
| Map<String, Object> objectMap = JsonUtils.removeMapEmptyValue(map); |
| System.out.println("Map转json:"+objectMap); |
| |
| String jsonTow = JsonUtils.toJsonWithDefaultPrettyPrinter(map1); |
| System.out.println("Map嵌套转json"+jsonTow); |
| |
| |
| |
| } |
| } |
| |
| JsonUtils工具类 |
| |
| public class JsonUtils { |
| |
| private static final ObjectMapper mapper; |
| |
| private JsonUtils() { |
| } |
| |
| static { |
| mapper = new ObjectMapper(); |
| mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); |
| } |
| |
| public static final String toJson(Object obj) { |
| try { |
| return mapper.writeValueAsString(obj); |
| } catch (Throwable e) { |
| e.printStackTrace(); |
| } |
| return ""; |
| } |
| |
| public static final String toJsonWithDefaultPrettyPrinter(Object obj) { |
| try { |
| return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); |
| } catch (Throwable e) { |
| e.printStackTrace(); |
| } |
| return ""; |
| } |
| |
| public static final <T> T fromJson(final String json, Class<T> clazz) { |
| try { |
| return mapper.readValue(json, clazz); |
| } catch (Throwable e) { |
| e.printStackTrace(); |
| } |
| return null; |
| } |
| |
| public static final <T> T fromJson(final String json, JavaType type) { |
| try { |
| return mapper.readValue(json, type); |
| } catch (Throwable e) { |
| e.printStackTrace(); |
| } |
| return null; |
| } |
| |
| public static final <T> T fromJson(final String json, TypeReference<T> reference) { |
| try { |
| return mapper.readValue(json, reference); |
| } catch (Throwable e) { |
| e.printStackTrace(); |
| } |
| return null; |
| } |
| |
| public static final Map<String, Object> fromJson(final String json) { |
| return fromJson(json, Map.class); |
| } |
| |
| public static Map<String, Object> removeMapEmptyValue(Map<String, Object> paramMap) { |
| Set<String> set = paramMap.keySet(); |
| Iterator<String> it = set.iterator(); |
| List<String> listKey = new ArrayList<String>(); |
| while (it.hasNext()) { |
| String str = it.next(); |
| if (paramMap.get(str) == null || "".equals(paramMap.get(str))) { |
| listKey.add(str); |
| } |
| } |
| for (String key : listKey) { |
| paramMap.remove(key); |
| } |
| return paramMap; |
| } |
| |
| } |
spring中直接初始配置jackjson
点击查看代码
| spring: |
| jackson: |
| |
| date-format: yyyy-MM-dd HH:mm:ss |
| serialization: |
| |
| indent_output: false |
| |
| fail_on_empty_beans: false |
| |
| defaultPropertyInclusion: NON_EMPTY |
| deserialization: |
| |
| fail_on_unknown_properties: false |
| parser: |
| |
| allow_unquoted_control_chars: true |
| |
| allow_single_quotes: true |
点击查看代码
| @Bean |
| @Primary |
| @ConditionalOnMissingBean(ObjectMapper.class) |
| public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) |
| { |
| ObjectMapper objectMapper = builder.createXmlMapper(false).build(); |
| |
| |
| |
| |
| |
| |
| objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); |
| objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); |
| |
| objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); |
| |
| objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); |
| |
| objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() |
| { |
| @Override |
| public void serialize(Object o, JsonGenerator jsonGenerator, |
| SerializerProvider serializerProvider) |
| throws IOException |
| { |
| jsonGenerator.writeString(""); |
| } |
| }); |
| return objectMapper; |
| } |
https://www.jianshu.com/p/96a21c971adc
摘抄自:
作者:新一代程序员
链接:https://juejin.cn/post/7060888543912001572
来源:稀土掘金
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异