在Kotlin中如何将指定字符串转换为JSON?
解决方法
首先,你提供的输入字符串并非合法JSON格式,存在两处关键语法错误:
- 用方括号
[]定义键值对对象(JSON规范要求对象用大括号{}) - 试图在数组(外层
[])中存储键值对(数组仅支持有序元素,键值对应使用对象{})
修正后的合法JSON结构
正确的结构应该是一个顶层对象,将数字作为字符串键,套餐信息作为对应值:
{ "1": {"price":100, "dataAmount":0.5}, "3": {"price":300, "dataAmount":1}, "5": {"price":500, "dataAmount":2}, "7": {"price":700, "dataAmount":3}, "10": {"price":1000, "dataAmount":5}, "31": {"price":3100, "dataAmount":15}, "365": {"price":36000, "dataAmount":1024}, "39": {"price":3900, "dataAmount":20, "daysValid":31}, "93": {"price":9000, "dataAmount":150} }
使用Java JSONObject的具体实现方案
假设你使用的是org.json库,步骤如下:
1. 修正原字符串格式
通过字符串替换修复语法错误:
String rawInput = "[1:[\"price\":100, \"dataAmount\":0.5], 3:[\"price\":300, \"dataAmount\":1], 5:[\"price\":500, \"dataAmount\":2], 7:[\"price\":700, \"dataAmount\":3], 10:[\"price\":1000, \"dataAmount\":5], 31:[\"price\":3100, \"dataAmount\":15], 365:[\"price\":36000, \"dataAmount\":1024], 39:[\"price\":3900, \"dataAmount\":20, \"daysValid\":31], 93:[\"price\":9000, \"dataAmount\":150]]"; // 替换外层数组为对象 String fixedInput = rawInput.replaceFirst("^\\[", "{").replaceFirst("\\]$", "}"); // 替换每个套餐的数组为对象,并给数字键加引号 fixedInput = fixedInput.replaceAll("(\\d+):\\[", "\"$1\":{"); // 替换套餐对象的结束括号 fixedInput = fixedInput.replaceAll("\\],", "},"); fixedInput = fixedInput.replaceAll("\\]$", "}");
2. 解析为JSONObject
将修正后的字符串解析为JSONObject并使用:
import org.json.JSONObject; import org.json.JSONException; public class JsonParser { public static void main(String[] args) { String rawInput = "[1:[\"price\":100, \"dataAmount\":0.5], 3:[\"price\":300, \"dataAmount\":1], 5:[\"price\":500, \"dataAmount\":2], 7:[\"price\":700, \"dataAmount\":3], 10:[\"price\":1000, \"dataAmount\":5], 31:[\"price\":3100, \"dataAmount\":15], 365:[\"price\":36000, \"dataAmount\":1024], 39:[\"price\":3900, \"dataAmount\":20, \"daysValid\":31], 93:[\"price\":9000, \"dataAmount\":150]]"; // 格式修正 String fixedInput = rawInput.replaceFirst("^\\[", "{") .replaceFirst("\\]$", "}") .replaceAll("(\\d+):\\[", "\"$1\":{") .replaceAll("\\],", "},") .replaceAll("\\]$", "}"); try { JSONObject result = new JSONObject(fixedInput); // 示例:获取键为"39"的套餐信息 JSONObject package39 = result.getJSONObject("39"); System.out.println("39天套餐价格:" + package39.getInt("price")); // 输出格式化后的JSON System.out.println(result.toString(2)); } catch (JSONException e) { e.printStackTrace(); // 处理格式异常 } } }
3. 依赖引入
如果使用Maven,需在pom.xml中添加org.json依赖:
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20240303</version> </dependency>
内容的提问来源于stack exchange,提问作者Marcin Stolarski
相关产品推荐
相关产品推荐

