JSON数据操作与处理全面指南

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于前后端的数据传递和API通信中。它基于键值对的方式组织数据,便于人类阅读和机器解析。在Java开发中,处理JSON数据通常需要使用一些常见的库,如Jackson、Gson、Fastjson等。本篇将介绍JSON的基本概念、常用操作及在Java中的具体应用。

一、JSON的基本概念

JSON的数据结构包括两种:对象数组

  • 对象:使用 {} 括起来,内部是键值对的集合,每个键和值之间用冒号 : 分隔,多个键值对之间用逗号 , 分隔。例如:

    {
      "name": "Alice",
      "age": 25,
      "address": {
        "city": "New York",
        "zip": "10001"
      }
    }
    
  • 数组:使用 [] 括起来,内部是多个值,每个值之间用逗号分隔。例如:

    [
      "apple",
      "banana",
      "cherry"
    ]
    

二、JSON处理常见库

1. Jackson

Jackson 是Java中处理JSON最常用的库之一,它能够轻松地将Java对象与JSON字符串互相转换,具备高效、灵活、功能强大的特点。

  • 对象转JSON

    ObjectMapper objectMapper = new ObjectMapper();
    User user = new User("Alice", 25);
    String jsonString = objectMapper.writeValueAsString(user);
    
  • JSON转对象

    String jsonString = "{\"name\":\"Alice\", \"age\":25}";
    User user = objectMapper.readValue(jsonString, User.class);
    

Jackson还支持复杂类型的解析、忽略字段、日期格式化等高级功能。

2. Gson

Gson 是由Google提供的另一款流行的JSON处理库。它以轻量、易用著称,适合处理简单的JSON数据结构。

  • 对象转JSON

    Gson gson = new Gson();
    User user = new User("Bob", 30);
    String jsonString = gson.toJson(user);
    
  • JSON转对象

    String jsonString = "{\"name\":\"Bob\", \"age\":30}";
    User user = gson.fromJson(jsonString, User.class);
    

Gson的API风格简单明了,但在性能上可能略逊于Jackson。

3. Fastjson

Fastjson 是阿里巴巴开源的高性能JSON库,特别在解析大量JSON数据时表现出色。

  • 对象转JSON

    User user = new User("Charlie", 28);
    String jsonString = JSON.toJSONString(user);
    
  • JSON转对象

    String jsonString = "{\"name\":\"Charlie\", \"age\":28}";
    User user = JSON.parseObject(jsonString, User.class);
    

Fastjson支持丰富的序列化/反序列化选项,还能够处理JSONPath等高级功能。

三、JSON的常见操作

1. 解析复杂的JSON结构

通常我们处理的JSON不仅仅是简单的对象,还可能是嵌套的对象或数组。以Jackson为例,我们可以使用 TypeReference 来处理复杂的嵌套类型。

String jsonString = "[{\"name\":\"Alice\",\"age\":25},{\"name\":\"Bob\",\"age\":30}]";
ObjectMapper mapper = new ObjectMapper();
List<User> users = mapper.readValue(jsonString, new TypeReference<List<User>>(){});
2. JSON与Map互转

在实际开发中,有时我们希望将JSON数据转为 Map<String, Object>,以便于动态操作数据。

  • JSON转Map

    ObjectMapper objectMapper = new ObjectMapper();
    String jsonString = "{\"name\":\"Alice\", \"age\":25}";
    Map<String, Object> map = objectMapper.readValue(jsonString, new TypeReference<Map<String,Object>>(){});
    
  • Map转JSON

    Map<String, Object> map = new HashMap<>();
    map.put("name", "Alice");
    map.put("age", 25);
    String jsonString = objectMapper.writeValueAsString(map);
    
3. 处理日期和时间格式

JSON默认不支持日期格式,因此在处理日期类型的字段时需要特别处理。以Jackson为例,可以通过 @JsonFormat 注解指定日期格式。

public class Event {
  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
  private Date eventDate;
  // getters and setters
}

反序列化时,也可以全局配置 ObjectMapper 以处理日期格式:

ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
4. 忽略字段

在序列化/反序列化时,我们可能需要忽略某些不必要的字段。以Jackson为例,可以通过 @JsonIgnore 注解来忽略字段。

public class User {
  private String name;
  @JsonIgnore
  private String password;
  // getters and setters
}

这将确保 password 字段不会出现在生成的JSON中。

5. 获取Json数据中某个字段
    // 获取params里面的documentId
    JsonNode jsonNode = new ObjectMapper().readTree(record.getParams());
    if (jsonNode.has("documentId")) {
        Integer documentId = jsonNode.get("documentId").asInt();
        record.setDocTypeId(documentId);
        if (clearLogDto.getDocTypeId() != null && !documentId.equals(clearLogDto.getDocTypeId())) {
            delete.add(record);
        }
    }

性能对比

在选择JSON库时,性能是一个重要的考虑因素。下表简要对比了Jackson、Gson、Fastjson三者的性能表现:

特性JacksonGsonFastjson
性能
易用性
功能丰富性
社区支持

参考:

JSON处理——FastJson、Jackson、Gson详细使用_gson fastjson-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值