使用Gson Java读取Json格式的问题

时间:2019-05-01 23:55:12

标签: java json gson jsonforms

我需要将完整的字符串转换为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时出现错误:

  

线程“ main”中的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 \“,\”邮政编码\“:\” 12291 \“}”     在com.google.gson.JsonElement.getAsJsonObject(JsonElement.java:90)     在   bncingestion.kafkaconsumer.validating_payload(kafkaconsumer.java:31)     在bncingestion.kafkaconsumer.main(kafkaconsumer.java:15)

感谢您的帮助。 谢谢

1 个答案:

答案 0 :(得分:1)

调用req.setRetryPolicy(new RetryPolicy() { @Override public int getCurrentTimeout() { return 360000; } @Override public int getCurrentRetryCount() { return 5000; } @Override public void retry(VolleyError error) throws VolleyError { } }); queue.add(req); 会将值(jobj.get("address").toString())格式化为JSON,并且由于该值是字符串,因此会添加引号并转义内容。不要这样做,也就是说,如果您追求的是 value ,请不要显式或隐式调用JsonElement

toString()替换行
另外,将行替换为String address = jobj.get("address").getAsString();