首页 > 解决方案 > 无法将 Json 反序列化为字符串数组

问题描述

我正在尝试获取一组 JSon 对象并将其放入 String 数组中。我不断得到 org.glassfish.json.JsonStringImpl cannot be cast to javax.json.JsonObject ,不知道该怎么办。

目前我有:

 BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
  String jsonStr = "";
  if(br != null){
      jsonStr = br.readLine();
  }

  // Create JsonReader object
  StringReader strReader = new StringReader(jsonStr);
  JsonReader reader = Json.createReader(strReader);

  // Get the singular JSON object (name:value pair) in this message.    
  JsonObject obj = reader.readObject();
  // From the object get the array named "inList"
  JsonArray inArray = obj.getJsonArray("inList");

  String[] myArray = new String[inArray.size()];

  // Fills myArray with Json Objects converted to Strings
 for (int i = 0; i < inArray.size(); i++) {
     myArray[i] = inArray.get(i).toString();
  }

示例输入 Json 为: { "inList" : [ "Bob", "boj", "obb", "job", "BOB", "foo" ] }

标签: javajsonstring

解决方案


所以在我看来,由于不匹配,您没有完全正确地解析 json。在 java 中解析 JSON 时,强烈建议使用名为GSON的库。

我在下面提供了完整的解决方案:

class ClassName {
    static Gson gson = new Gson();

    public static void main(String[] args) {
        String jsonStr = " { \"inList\" : [ \"Bob\", \"boj\", \"obb\", \"job\", \"BOB\", \"foo\" ] }";

        String[] inList = gson.fromJson(jsonStr, Container.class).inList;

        for (String s : inList) System.out.println(s);
    }

    private class Container {
        String[] inList;
    }
}

输出:

Bob
boj
obb
job
BOB
foo

您仍然会像您一样获取 JSON 字符串(如果您遇到问题,请发布一个附加问题),但您只需将我的代码粘贴在下面即可成功解析 JSON 数组。

也可以获取 List 而不是 Array。您可以通过将容器类中的字段替换为List<String> inList;,并将 main 中的行更改为:

List<String> inList = gson.fromJson(jsonStr, Container.class).inList;

关于您的代码的附加说明:您的 if 语句if (br != null)始终为真,因为您在上面对其进行了初始化。此外,以下jsonStr = br.readLine()可能会引发 IOException。你可以像这样抓住它:

 try {
      jsonStr = br.readLine();
 } catch (IOException e) {
      e.printStackTrace();
      //do whatever you want etc.
 }

推荐阅读