Java中如何将多行分隔的HashMap数据字符串转换为JSONObject或HashMap
问题根因
你当前拿到的数据是**行式JSON(JSON Lines)**格式,每一行是独立的合法JSON对象,但整段字符串没有用方括号包裹为JSON数组、对象之间也没有逗号分隔,不符合标准JSON语法,所以直接解析整串会报错。
可行解决思路
方案1:按行逐行解析(推荐,无需修改原始数据)
你可以先把整段字符串按换行符切割为独立的行,逐行用Gson解析每个单独的JSON对象,最后汇总到集合里即可,示例代码如下:
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.util.ArrayList; import java.util.HashMap; import java.util.List; // 假设原始数据字符串为rawData String[] lineArr = rawData.split("\\R"); // 适配所有换行符(\n、\r\n等) Gson gson = new Gson(); List<HashMap<String, Object>> resultList = new ArrayList<>(); for (String line : lineArr) { // 跳过空行避免解析错误 if (line.trim().isEmpty()) { continue; } HashMap<String, Object> item = gson.fromJson(line, new TypeToken<HashMap<String, Object>>(){}.getType()); resultList.add(item); }
最终resultList中就存储了所有行对应的HashMap数据。
方案2:将原始数据拼接为合法JSON数组再解析
如果不想逐行处理,也可以对原始字符串做简单改造,把它转换为标准JSON数组格式后再一次性解析:
// 给整段数据外层加方括号,把换行符替换为逗号,拼接为标准JSON数组 String jsonArrayStr = "[" + String.join(",", rawData.split("\\R")) + "]"; Gson gson = new Gson(); List<HashMap<String, Object>> resultList = gson.fromJson(jsonArrayStr, new TypeToken<List<HashMap<String, Object>>>(){}.getType());
注意:这个方案仅适用于每行都是完整JSON对象、无多余空行的场景,如果原始数据存在空行需要先过滤再拼接。
额外说明
后续遇到同类每行一条JSON的输入时,优先选择逐行解析的方案,容错性更高,遇到某行格式错误可以单独跳过,不会影响其他行的数据解析。
内容的提问来源于stack exchange,提问作者Hasni
相关产品推荐
相关产品推荐

