【问题标题】:Cannot deserialize Json into String array无法将 Json 反序列化为字符串数组
【发布时间】:2018-11-02 22:50:43
【问题描述】:

我正在尝试获取一个 JSon 对象数组并将其放入一个字符串数组中。我不断收到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" ] }

【问题讨论】:

  • 当你使用writeObject方法时,你输入了一个JsonStringImpl,而你想将reader.readObject()变成一个JsonObject,它们是不一样的,你不能
  • @azro 有什么解决办法吗?我的目标是对它们进行散列,但如果它们不是字符串,我的散列函数将不起作用
  • 我不是来帮忙的,我只是指出了它不起作用的原因,你需要在输入和输出处使用相同的类

标签: java json string


【解决方案1】:

所以在我看来,由于不匹配,您没有完全正确地解析 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&lt;String&gt; inList; 并将 main 中的行更改为:

List&lt;String&gt; 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.
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多