使用 Gson Java 发出阅读 Json 格式
Issue reading Json format with Gson Java
我需要将完整的字符串转换为 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();
这个return正确的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
return 正确 {\"street\":\"Coralie Trafficway\",\"zipcode\":\"12291\"}
但是当我尝试打印 jaddress.zipcode 时出现错误:
Exception in thread "main" com.google.gson.JsonSyntaxException:
com.google.gson.stream.MalformedJsonException: Expected name at line 1
column 2 path $. at com.google.gson.Gson.fromJson(Gson.java:902) at
com.google.gson.Gson.fromJson(Gson.java:852) at
com.google.gson.Gson.fromJson(Gson.java:801) at
com.google.gson.Gson.fromJson(Gson.java:773) at
bncingestion.kafkaconsumer.validating_payload(kafkaconsumer.java:29)
at bncingestion.kafkaconsumer.main(kafkaconsumer.java:15) Caused by:
com.google.gson.stream.MalformedJsonException: Expected name at line 1
column 2 path $. at
com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1559)
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:513) at
com.google.gson.stream.JsonReader.hasNext(JsonReader.java:414) at
com.google.gson.internal.bind.TypeAdapters.read(TypeAdapters.java:738)
at
com.google.gson.internal.bind.TypeAdapters.read(TypeAdapters.java:714)
at
com.google.gson.internal.bind.TypeAdapters.read(TypeAdapters.java:910)
at com.google.gson.Gson.fromJson(Gson.java:887) ... 5 more
此转换没有删除 "
的附加版本在这里:
String address = jobj.get("address").toString();
JsonElement jeaddress = g.fromJson(address, JsonElement.class);
JsonObject jaddress = jeaddress.getAsJsonObject();
System.out.println(jaddress.get("zipcode"));
在这种情况下,错误是:
Exception in thread "main" java.lang.IllegalStateException: Not a JSON
Object: "{\"street\":\"Coralie Trafficway\",\"zipcode\":\"12291\"}"
at com.google.gson.JsonElement.getAsJsonObject(JsonElement.java:90)
at
bncingestion.kafkaconsumer.validating_payload(kafkaconsumer.java:31)
at bncingestion.kafkaconsumer.main(kafkaconsumer.java:15)
感谢任何帮助。
谢谢
调用 jobj.get("address").toString()
将值 (a JsonElement
) 格式化为 JSON,并且由于该值是一个字符串,它会添加引号并转义内容。不要那样做,即如果你在 value.
之后,不要显式或隐式地调用 toString()
将行替换为 String address = jobj.get("address").getAsString();
也用 System.out.println(jaddress.get("zipcode").getAsString());
替换行
我需要将完整的字符串转换为 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();
这个return正确的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
return 正确 {\"street\":\"Coralie Trafficway\",\"zipcode\":\"12291\"}
但是当我尝试打印 jaddress.zipcode 时出现错误:
Exception in thread "main" com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $. at com.google.gson.Gson.fromJson(Gson.java:902) at com.google.gson.Gson.fromJson(Gson.java:852) at com.google.gson.Gson.fromJson(Gson.java:801) at com.google.gson.Gson.fromJson(Gson.java:773) at bncingestion.kafkaconsumer.validating_payload(kafkaconsumer.java:29) at bncingestion.kafkaconsumer.main(kafkaconsumer.java:15) Caused by: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $. at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1559) at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:513) at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:414) at com.google.gson.internal.bind.TypeAdapters.read(TypeAdapters.java:738) at com.google.gson.internal.bind.TypeAdapters.read(TypeAdapters.java:714) at com.google.gson.internal.bind.TypeAdapters.read(TypeAdapters.java:910) at com.google.gson.Gson.fromJson(Gson.java:887) ... 5 more
此转换没有删除 "
的附加版本在这里:
String address = jobj.get("address").toString();
JsonElement jeaddress = g.fromJson(address, JsonElement.class);
JsonObject jaddress = jeaddress.getAsJsonObject();
System.out.println(jaddress.get("zipcode"));
在这种情况下,错误是:
Exception in thread "main" java.lang.IllegalStateException: Not a JSON Object: "{\"street\":\"Coralie Trafficway\",\"zipcode\":\"12291\"}" at com.google.gson.JsonElement.getAsJsonObject(JsonElement.java:90) at bncingestion.kafkaconsumer.validating_payload(kafkaconsumer.java:31) at bncingestion.kafkaconsumer.main(kafkaconsumer.java:15)
感谢任何帮助。 谢谢
调用 jobj.get("address").toString()
将值 (a JsonElement
) 格式化为 JSON,并且由于该值是一个字符串,它会添加引号并转义内容。不要那样做,即如果你在 value.
toString()
将行替换为 String address = jobj.get("address").getAsString();
也用 System.out.println(jaddress.get("zipcode").getAsString());