(已解决)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如果此问题已解决,请选择最佳答案。