Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(已解决)Java:从Json字符串获取值(Set<;string>;)_Java_Json_Parsing - Fatal编程技术网

(已解决)Java:从Json字符串获取值(Set<;string>;)

(已解决)Java:从Json字符串获取值(Set<;string>;),java,json,parsing,Java,Json,Parsing,所以,我使用这个方法返回一个集,但实际上我得到的是一个类似这样的Json字符串 [ { "id":"Id1" }, { "id":"Id2", "title":"anyTitle" } ] 我的目标是获取键“id”的值。我还制作了一个java bean来映射数据: public class Data { private String id; private String title; public String getId() {

所以,我使用这个方法返回一个
,但实际上我得到的是一个类似这样的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进行解析,但我只能得到一个错误:无法将“java.util.LinkedHashMap$LinkedKeyIterator”强制转换为“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);
        }
Set availableData=getData()//此方法返回一个json字符串
迭代器itr=availableData.Iterator();
while(itr.hasNext()){
Gson Gson=新的Gson();
JsonParser=新的JsonParser();
JsonObject object=(JsonObject)parser.parse(itr.next());
Data=gson.fromJson(对象,Data.class);
}
更新:实际错误是:类型不匹配无法将com.google.common.collect.Maps$TransformedEntriesMap分配给java.lang.String


非常感谢您的帮助。

在这一行中,您将传递一个迭代器:

JsonObject object = (JsonObject) parser.parse((JsonReader) itr);
但您应该传递下一个元素:

JsonObject object = (JsonObject) parser.parse(itr.next());
此外,JSON中还有一个额外的逗号


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

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

使用Jackson映射器。您可以直接将其转换为对象并通过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();
}

因此,在这个相关问题之后:,最后我使用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();
Set availableData=getData();
JSONArray dataArray=新的JSONArray(可用数据);
List dataList=dataArray.toList();
对象o=dataList.stream()
.filter(c->((Map)c).get(“id”).toString()包含(“Id1”))
.findFirst().orElse(null);
return((Map)o.get(“id”).toString();

也许您想知道如何使用Gson将json非序列化为java对象

这里有两种方法我可以给你

public void parse(){
字符串jsonString=“[\n”+
“{\n”+
“\“id\”:\“Id1\”\n”+
},\n+
“{\n”+
“\“id\:\“Id2\”,\n”+
“\“title\:\“anyTitle\”\n”+
“}\n”+
"]";
Gson Gson=新的Gson();
//使用Gson类型
类型setType=newtypetoken(){}.getType();
Set dataSet=gson.fromJson(jsonString,setType);
//打印[数据{id='Id2',title='anyTitle'},数据{id='Id1',title='null'}]
System.out.println(数据集);
//使用Java数组
Data[]dataArray=gson.fromJson(jsonString,Data[].class);
//打印[数据{id='Id1',title='null'},数据{id='Id2',title='anyTitle'}]
System.out.println(Arrays.toString(dataArray));
}

感谢您的回答,我尝试了您的建议,但现在我遇到了以下错误:类型不匹配无法将com.google.common.collect.Maps$TransformedEntriesMap分配到java.lang.StringCheck此代码段:JSON是否有其他格式?getData()的返回类型是什么?@AbinashGhosh Maps$TransformedEntriesMap如果此问题已解决,请选择最佳答案。