如何在Java中将特定格式字符串转换为JSON负载
Java字符串转指定JSON结构方案
实现步骤
要将给定的类toString格式字符串转换为目标JSON,需要完成字符串解析提取键值对、数据类型适配、添加额外字段和JSON序列化这几个核心步骤,以下是具体实现:
代码实现(以Gson为例)
import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.HashMap; import java.util.Map; public class BeaconToJson { public static void main(String[] args) { // 原始输入字符串 String inputStr = "iBeaconDevice{address='F1:E4:E4:AD:24:50', uniqueId='null', proximityUUID=b9407f30-f5f8-466e-aff9-25556b57fe6d, major=35823, minor=10411, rssi=-56, shuffled=false}"; // 1. 剥离类名和外层大括号,提取核心键值对内容 String content = inputStr.replaceAll("^iBeaconDevice\\{|\\}$", ""); // 2. 分割单个键值对 String[] keyValuePairs = content.split(", "); Map<String, Object> beaconData = new HashMap<>(); for (String pair : keyValuePairs) { // 分割键与值(仅分割第一个=,避免值中出现=的情况) String[] keyValue = pair.split("=", 2); String key = keyValue[0]; String rawValue = keyValue[1]; // 处理带单引号包裹的值 if (rawValue.startsWith("'") && rawValue.endsWith("'")) { rawValue = rawValue.substring(1, rawValue.length() - 1); } // 3. 根据字段类型适配数据格式 switch (key) { case "major": case "minor": case "rssi": beaconData.put(key, Integer.parseInt(rawValue)); break; case "shuffled": // 按目标要求转为字符串类型,若需布尔值可改为Boolean.parseBoolean(rawValue) beaconData.put(key, rawValue); break; default: // address、uniqueId、proximityUUID均为字符串类型 beaconData.put(key, rawValue); } } // 4. 添加timestamp字段(当前系统时间戳) beaconData.put("timestamp", System.currentTimeMillis()); // 5. 序列化为格式化的JSON Gson gson = new GsonBuilder().setPrettyPrinting().create(); String jsonResult = gson.toJson(beaconData); System.out.println(jsonResult); } }
关键细节说明
- 字符串解析:用正则
^iBeaconDevice\\{|\\}$精准移除开头的类名和结尾的大括号,避免手动截取的误差; - 键值对分割:使用
,作为分隔符拆分每个字段,确保不会误分割值中包含的逗号; - 类型适配:针对数字类型字段(major、minor、rssi)转为整数,shuffled按目标要求保留字符串格式,其余字段直接作为字符串存储;
- JSON序列化:借助Gson的
setPrettyPrinting()生成格式化的JSON,和目标结构完全匹配。
备选方案(Jackson实现)
如果使用Jackson库,替换序列化部分即可:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; // ... 前面的字符串解析逻辑一致 ... ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); String jsonResult = mapper.writeValueAsString(beaconData); System.out.println(jsonResult);
内容的提问来源于stack exchange,提问作者matchaLover
相关产品推荐
相关产品推荐

