【发布时间】:2019-05-01 23:55:12
【问题描述】:
我需要将一个完整的字符串转换为 Json 格式,挑战在于在有效负载中有一个嵌套字段,同样需要读取为 Json。
我的java代码如下:
- 首先我读取了字符串:
String payload
="{\"appId\":\"APP02\",\"employeeId\":\"789-33-3887\",\"name\":\"Paolo Ledner\",\"phonenumber\":\"757.910.0396\",\"beer\":\"Sierra Nevada Bigfoot Barleywine Style Ale\",\"company\":\"Schmidt LLC\",\"address\":\"{\\\"street\\\":\\\"Coralie Trafficway\\\",\\\"zipcode\\\":\\\"12291\\\"}\"}";
- 现在我读取了我的第一个 JSON 对象:
Gson g = new Gson();
JsonElement jelem = g.fromJson(payload,JsonElement.class);
JsonObject jobj = jelem.getAsJsonObject();
这会正确返回 Json 对象,但我无法从嵌套字段 address 中读取键,然后我需要读取此字段的内容,将其转换为字符串,然后根据我的逻辑应用相同的方法要获取 Json 格式并读取我需要的密钥,这是这一步:
String address = jobj.get("address").toString().substring(1,jobj.get("address").toString().length()-1);
JsonElement jeaddress = g.fromJson(address, JsonElement.class);
JsonObject jaddress = jeaddress.getAsJsonObject();
System.out.println(jaddress.get("zipcode"));
问题:
字符串 address 正确返回 {\"street\":\"Coralie Trafficway\",\"zipcode\":\"12291\"} 但是当我尝试打印 jaddress.zipcode 时出现错误:
线程“主”com.google.gson.JsonSyntaxException 中的异常: com.google.gson.stream.MalformedJsonException:第 1 行的预期名称 第 2 列路径 $。在 com.google.gson.Gson.fromJson(Gson.java:902) 在 com.google.gson.Gson.fromJson(Gson.java:852) 在 com.google.gson.Gson.fromJson(Gson.java:801) 在 com.google.gson.Gson.fromJson(Gson.java:773) 在 bncingestion.kafkaconsumer.validating_payload(kafkaconsumer.java:29) 在 bncingestion.kafkaconsumer.main(kafkaconsumer.java:15) 引起: com.google.gson.stream.MalformedJsonException:第 1 行的预期名称 第 2 列路径 $。在 com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1559) 在 com.google.gson.stream.JsonReader.doPeek(JsonReader.java:513) 在 com.google.gson.stream.JsonReader.hasNext(JsonReader.java:414) 在 com.google.gson.internal.bind.TypeAdapters$29.read(TypeAdapters.java:738) 在 com.google.gson.internal.bind.TypeAdapters$29.read(TypeAdapters.java:714) 在 com.google.gson.internal.bind.TypeAdapters$35$1.read(TypeAdapters.java:910) 在 com.google.gson.Gson.fromJson(Gson.java:887) ... 5 更多
这里还有一个没有删除" 的转换版本:
String address = jobj.get("address").toString();
JsonElement jeaddress = g.fromJson(address, JsonElement.class);
JsonObject jaddress = jeaddress.getAsJsonObject();
System.out.println(jaddress.get("zipcode"));
在这种情况下,错误是:
线程“主”java.lang.IllegalStateException 中的异常:不是 JSON 对象:"{\"street\":\"Coralie Trafficway\",\"zipcode\":\"12291\"}" 在 com.google.gson.JsonElement.getAsJsonObject(JsonElement.java:90) 在 bncingestion.kafkaconsumer.validating_payload(kafkaconsumer.java:31) 在 bncingestion.kafkaconsumer.main(kafkaconsumer.java:15)
感谢您的帮助。 谢谢
【问题讨论】:
-
为什么要从
address文本值中删除第一个和最后一个字符?"address"的文本值为"{\"street\":\"Coralie Trafficway\",\"zipcode\":\"12291\"}",解析为文本{"street":"Coralie Trafficway","zipcode":"12291"},所以如果去掉第一个和最后一个字符,它就不再是有效的JSON,因为你刚刚去掉了{}大括号它是一个 JSON 对象。 --- 也许如果您已经调试您的代码,例如打印了jobj.get("address").toString()的值,你自己就已经看到了。 -
我什至尝试过不删除这两个双引号并发生同一个人。
-
我已经用那个版本和错误更新了帖子