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
相关产品推荐
相关产品推荐

