【问题标题】:(SOLVED) Java: Get value from a Json string (Set<String>)(已解决)Java:从 Json 字符串中获取值(Set<String>)
【发布时间】:2020-04-10 11:03:32
【问题描述】:

所以,我使用这个方法返回一个Set&lt;String&gt;,但实际上我得到的是一个像这样的Json字符串

[
  {
   "id":"Id1"
  },
  {
  "id":"Id2",
  "title":"anyTitle"
  }
]

我的目标是获取键“id”的值。我还制作了一个 java bean 来映射数据:

public class Data {
    private String id;
    private String title;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

我尝试使用 gson 进行解析,但我得到的只是一个错误:Cannot cast 'java.util.LinkedHashMap$LinkedKeyIterator' to 'com.google.gson.stream.JsonReader'

那么,显然我做错了什么:

Set<String> availableData = getData(); //this method returns a json string
Iterator<String> itr = availableData.iterator();
        while (itr.hasNext()) {
            Gson gson = new Gson();
            JsonParser parser = new JsonParser();
            JsonObject object = (JsonObject) parser.parse(itr.next());
            Data data = gson.fromJson(object, Data.class);
        }

更新:实际错误是:Type mismatch Can't assign com.google.common.collect.Maps$TransformedEntriesMap to java.lang.String

任何帮助将不胜感激。

【问题讨论】:

  • getData() 的返回类型是什么?
  • @AbinashGhosh Maps$TransformedEntriesMap
  • 如果这个问题解决了,请选择最佳答案。

标签: java json parsing


【解决方案1】:

在该行中,您传递了一个迭代器:

JsonObject object = (JsonObject) parser.parse((JsonReader) itr);

但是你应该传递下一个元素:

JsonObject object = (JsonObject) parser.parse(itr.next());

此外,您的 JSON 中有一个额外的逗号。


您可以用该行替换整个块:

Data data = gson.fromJson(itr.next(),Data.class)

【讨论】:

  • 感谢您的回答,我尝试了您的建议,但现在我收到此错误:类型不匹配无法将 com.google.common.collect.Maps$TransformedEntriesMap 分配给 java.lang.String
  • 检查这个 sn-p:pastebin.com/cpPEP3zP 在您的情况下 JSON 是否有其他格式?
【解决方案2】:

使用杰克逊映射器。您可以直接将其转换为对象并通过 getter 进行检索。

 ObjectMapper objectMapper = new ObjectMapper();

String carJson =
    "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

try {
    Car car = objectMapper.readValue(carJson, Car.class);

    System.out.println("car brand = " + car.getBrand());
    System.out.println("car doors = " + car.getDoors());
} catch (IOException e) {
    e.printStackTrace();
}

【讨论】:

    【解决方案3】:

    所以,根据这个相关问题:https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/5154,最后我使用 JSONArray 和来自 java8 的流进行映射

    Set<String> availableData = getData();
            JSONArray dataArray = new JSONArray(availableData);
            List<Object> dataList = dataArray.toList();
            Object o = dataList.stream()
                    .filter(c -> ((Map) c).get("id").toString().contains("Id1"))
                    .findFirst().orElse(null);
            return ((Map)o).get("id").toString();
    

    【讨论】:

      【解决方案4】:

      也许你想知道如何使用 Gson 将 json 反序列化为 java 对象。

      我可以给你两种方法。

          public void parse() {
              String jsonString = "[\n" +
                  "  {\n" +
                  "   \"id\":\"Id1\"\n" +
                  "  },\n" +
                  "  {\n" +
                  "  \"id\":\"Id2\",\n" +
                  "  \"title\":\"anyTitle\"\n" +
                  "  }\n" +
                  "]";
      
              Gson gson = new Gson();
      
              // Use Gson Type
              Type setType = new TypeToken<HashSet<Data>>(){}.getType();
              Set<Data> dataSet = gson.fromJson(jsonString, setType);
      
              // Print [Data{id='Id2', title='anyTitle'}, Data{id='Id1', title='null'}]
              System.out.println(dataSet);
      
              // Use Java Array
              Data[] dataArray = gson.fromJson(jsonString, Data[].class);
      
              // Print [Data{id='Id1', title='null'}, Data{id='Id2', title='anyTitle'}]
              System.out.println(Arrays.toString(dataArray));
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-30
        • 2021-07-13
        • 1970-01-01
        • 2020-11-10
        • 2013-06-27
        • 1970-01-01
        • 2023-03-18
        相关资源
        最近更新 更多