You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何将JSON对象内的字符串类型属性解析为对象属性

Java 实现JSON内嵌字符串类型JSON字段的嵌套转换

场景说明

现有JSON对象中fx字段的值为JSON格式的字符串,原始结构如下:

{
  "dt" : "2022-01-02 00:00:00",
  "fx": "{\"id\":1,\"faixaId\":1,\"speedAtivo\":true}",
  "hash": "8c91a61a0a49b73de2fc13caed00e6a93dbe435b354216802da0dbe8bfda3300"
}

JavaScript中可以直接通过a.fx = JSON.parse(a.fx)将字符串类型的fx字段转为嵌套对象,转换后结构如下:

{
  "dt" : "2022-01-02 00:00:00",
  "fx": {
    "id":1,
    "faixaId":1,
    "speedAtivo":true
  },
  "hash": "8c91a61a0a49b73de2fc13caed00e6a93dbe435b354216802da0dbe8bfda3300"
}

Java 实现方案

Java生态下主流JSON处理库都可以实现等价逻辑,核心思路和JS一致:先解析外层JSON,取出fx字段的字符串值,将该字符串解析为JSON对象后回写到外层对象即可。以下是三种最常用库的实现代码:

1. Jackson(SpringBoot默认集成的JSON库)

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

public class JacksonDemo {
    public static void main(String[] args) throws Exception {
        String rawJson = "{\"dt\":\"2022-01-02 00:00:00\",\"fx\":\"{\\\"id\\\":1,\\\"faixaId\\\":1,\\\"speedAtivo\\\":true}\",\"hash\":\"8c91a61a0a49b73de2fc13caed00e6a93dbe435b354216802da0dbe8bfda3300\"}";
        ObjectMapper mapper = new ObjectMapper();

        // 解析外层JSON
        JsonNode root = mapper.readTree(rawJson);
        // 读取fx字段的字符串值
        String fxContent = root.get("fx").asText();
        // 将fx字符串解析为JSON节点
        JsonNode fxNode = mapper.readTree(fxContent);
        // 回写替换原字符串字段
        ((ObjectNode) root).set("fx", fxNode);

        // 输出转换后的JSON,结构和JS处理结果完全一致
        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(root));
    }
}

2. Fastjson

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class FastjsonDemo {
    public static void main(String[] args) {
        String rawJson = "{\"dt\":\"2022-01-02 00:00:00\",\"fx\":\"{\\\"id\\\":1,\\\"faixaId\\\":1,\\\"speedAtivo\\\":true}\",\"hash\":\"8c91a61a0a49b73de2fc13caed00e6a93dbe435b354216802da0dbe8bfda3300\"}";
        JSONObject root = JSON.parseObject(rawJson);
        
        String fxContent = root.getString("fx");
        JSONObject fxObj = JSON.parseObject(fxContent);
        root.put("fx", fxObj);

        System.out.println(root.toJSONString());
    }
}

3. Gson

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class GsonDemo {
    public static void main(String[] args) {
        String rawJson = "{\"dt\":\"2022-01-02 00:00:00\",\"fx\":\"{\\\"id\\\":1,\\\"faixaId\\\":1,\\\"speedAtivo\\\":true}\",\"hash\":\"8c91a61a0a49b73de2fc13caed00e6a93dbe435b354216802da0dbe8bfda3300\"}";
        Gson gson = new Gson();
        JsonObject root = JsonParser.parseString(rawJson).getAsJsonObject();

        String fxContent = root.get("fx").getAsString();
        JsonElement fxElement = JsonParser.parseString(fxContent);
        root.add("fx", fxElement);

        System.out.println(gson.toJson(root));
    }
}

如果需要将JSON直接映射为Java实体类,只需要给fx字段定义对应结构的实体类,通过自定义反序列化器读取字段的字符串值,解析为目标实体后赋值即可,逻辑和上述树结构处理完全一致。


内容的提问来源于stack exchange,提问作者Jose Pacelli Oliveira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:09:31