在Java中如何将字符串化JSON内容转换为JSON对象?
Java中将带HTML转义的JSON字符串转换为JSON对象的实现方法
你提供的字符串包含HTML转义字符"(对应双引号),且首尾包裹了单引号,需要先做预处理再进行JSON解析,以下是两种常用的实现方案:
方案一:使用Jackson实现(Java生态最常用的JSON库)
1. 引入依赖(Maven)
<!-- Jackson核心依赖 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency> <!-- 用于HTML转义解码,可选,也可以手动替换转义字符 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.10.0</version> </dependency>
2. 代码实现
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.text.StringEscapeUtils; import java.util.List; public class JsonParseDemo { public static void main(String[] args) throws Exception { // 原始字符串 String rawStr = "'[\n" + " {\n" + " "fruit":"apple",\n" + " "color":"green"\n" + " },\n" + " {\n" + " "fruit":"banana",\n" + " "color":"yellow"\n" + " },\n" + " {\n" + " "fruit":"lime",\n" + " "color":"green"\n" + " },\n" + " {\n" + " "fruit":"peach",\n" + " "color":"pink"\n" + " }\n" + "]'"; // 预处理1:去掉首尾的单引号 String strWithoutQuote = rawStr.substring(1, rawStr.length() - 1); // 预处理2:解码HTML转义字符 String decodedJsonStr = StringEscapeUtils.unescapeHtml4(strWithoutQuote); // 解析为JSON数组对象 ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonArray = objectMapper.readTree(decodedJsonStr); // 也可以解析为自定义实体类集合 // List<Fruit> fruitList = objectMapper.readValue(decodedJsonStr, new TypeReference<List<Fruit>>() {}); // 测试输出 System.out.println(jsonArray.get(0).get("fruit").asText()); // 输出apple } // 自定义实体类示例 public static class Fruit { private String fruit; private String color; // 此处省略无参构造、getter、setter方法 } }
方案二:使用Fastjson实现(国内常用的高性能JSON库)
1. 引入依赖(Maven)
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson2</artifactId> <version>2.0.39</version> </dependency> <!-- 同方案一,HTML解码依赖,可选 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.10.0</version> </dependency>
2. 代码实现
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import org.apache.commons.text.StringEscapeUtils; import java.util.List; public class JsonParseDemo { public static void main(String[] args) { String rawStr = "'[\n" + " {\n" + " "fruit":"apple",\n" + " "color":"green"\n" + " },\n" + " {\n" + " "fruit":"banana",\n" + " "color":"yellow"\n" + " },\n" + " {\n" + " "fruit":"lime",\n" + " "color":"green"\n" + " },\n" + " {\n" + " "fruit":"peach",\n" + " "color":"pink"\n" + " }\n" + "]'"; // 预处理 String strWithoutQuote = rawStr.substring(1, rawStr.length() - 1); // 不想引入commons-text的话可以直接替换:strWithoutQuote.replace(""", "\"") String decodedJsonStr = StringEscapeUtils.unescapeHtml4(strWithoutQuote); // 解析为JSON数组 JSONArray jsonArray = JSON.parseArray(decodedJsonStr); // 解析为List<Fruit> // List<Fruit> fruitList = JSON.parseArray(decodedJsonStr, Fruit.class); // 测试输出 System.out.println(jsonArray.getJSONObject(0).getString("fruit")); // 输出apple } // 自定义实体类同方案一 public static class Fruit { private String fruit; private String color; } }
注意事项
- 如果你的场景中仅存在
"这一种HTML转义字符,可以不用引入commons-text依赖,直接用str.replace(""", "\"")替换即可,性能更好。 - 一定要先去掉原始字符串首尾的单引号再解析,否则会触发JSON格式错误。
内容的提问来源于stack exchange,提问作者Malin
相关产品推荐
相关产品推荐

