学习笔记:从JSON数据中提取嵌套字符串与实体类对象

学习笔记:从JSON数据中提取嵌套字符串与实体类对象

一、使用JsonNode提取嵌套字符串

示例JSON

{
  "unwantedData": {
    "someKey": "someValue",
    "anotherKey": "anotherValue"
  },
  "targetInfo": {
    "nestedString": "This is the string I want to extract"
  }
}

目标:提取targetInfo.nestedString处的字符串值。

Java代码示例

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

public class ExtractNestedStringExample {

    public static void main(String[] args) throws Exception {
        String json = ...; // JSON字符串

        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(json);

        // 以下两种方法都可以取出JSON字符串中被嵌套的字符串数据
        String nestedString = rootNode.get("targetInfo").get("nestedString").asText();
        String nestedString = rootNode.path("targetInfo").path("nestedString").asText();

        System.out.println("Extracted nested string: " + nestedString);
    }
}

二、get()path()方法的区别

  • get()方法

    • 直接访问JSON节点。
    • 如果指定的键在当前节点中不存在,抛出MissingNodeException异常。
    • 优点:执行效率可能稍高。
    • 缺点:遇到不存在的键时会立即抛出异常,可能导致程序中断。
  • path()方法

    • 访问JSON节点,遇到不存在的键时返回MissingNode对象。
    • MissingNode表示一个不存在的节点,对其操作(如asText())通常返回空值或默认值,而非抛出异常。
    • 优点:更稳健,即使遇到不存在的键也不会抛出异常,允许程序继续执行。
    • 缺点:理论上执行效率可能略低于get()方法,但实际应用中差异微乎其微。

三、提取顶层字符串

  • 对于仅提取顶层字符串,无论使用get()还是path()方法,都可以直接对顶层键名进行操作,效果相同。
  • 选择get()还是path()主要取决于对JSON数据完整性和异常处理的要求:
    • 确保JSON结构符合预期,希望在遇到错误时立即终止程序:使用get()方法。
    • 处理可能含有缺失节点的JSON数据,希望程序在遇到缺失节点时仍能继续运行:使用path()方法。

四、提取嵌套实体类对象

示例JSON

{
  "unwantedData": {
    "someKey": "someValue",
    "anotherKey": "anotherValue"
  },
  "targetEntity": {
    "id": 1,
    "name": "John Doe",
    "address": {
      "street": "123 Main St",
      "city": "Anytown",
      "country": "USA"
    }
  }
}

目标:提取targetEntity字段所对应的实体类对象(假设为User类),并忽略顶层的其他数据。

Java代码示例

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

public class ExtractNestedEntityExample {

    public static void main(String[] args) throws Exception {
        String json = ...; // JSON字符串

        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(json);

        // 提取targetEntity字段的JSON文本
        String nestedEntityJson = objectMapper.writeValueAsString(rootNode.get("targetEntity"));

        // 将提取出的JSON文本转换为User对象
        User user = objectMapper.readValue(nestedEntityJson, User.class);

        // 输出用户信息
        System.out.println("User Details:");
        System.out.println("ID: " + user.getId());
        System.out.println("Name: " + user.getName());

        // 输出地址信息(假设User类包含一个Address属性)
        System.out.println("\nAddress:");
        Address address = user.getAddress();
        System.out.println("Street: " + address.getStreet());
        System.out.println("City: " + address.getCity());
        System.out.println("Country: " + address.getCountry());
    }
}

解释

  • 使用ObjectMapper将整个JSON解析为JsonNode,然后通过get("targetEntity")提取出嵌套的实体类数据对应的JSON节点。
  • 将提取出的JSON节点使用writeValueAsString()方法转换为JSON字符串,以便后续单独转换为实体类对象。
  • 使用readValue()方法将JSON字符串转换为所需的User实体类对象。
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值