基本上我从包含名为“references”的键的服务器获取JSON响应,该键是一个String数组。如果没有找到先前的引用或者填充了以前的引用,它可以为空。
以下是我从服务器获得的回复。
{"code":100,
"name":"3PVxkvfKyUiBg3LN24ek23KceGg6350KSkLZ.html",
"file":{
"author":"test@test",
"idx":"xihav-zupak-zonyf-bedid-cyvun-fahac-mykud",
"name":"html_file",
"references":[
"relec-toluz",
"rosah-vyzyh",
"rikik-cinom"
]
}
}
我现在正在做的事情不是很好,我首先解析引用的内容以确定引用的数量然后我创建新的String数组并将每个值放入其中。但是我想知道是否有任何正确的方法来做到这一点。
这是我写的代码,这不是一段很好的代码:
if(file.has("references")){
String s = file.get("references").toString();
int counter =0;
//determine the amount of elements (check if the references does not finish with ','
if(s.length() > 2 && s.charAt(s.length()-2) != ','){
counter++;
System.out.println(s);
for(int i=0 ; i < s.length(); i++){ if( s.charAt(i) == ',' ) counter++;}
}else {
counter++;
for(int i = 0; i < s.length() -2; i++){ if(s.charAt(i) == ',') counter++;}
}
JsonArray referencesList = new Gson().fromJson(s, JsonArray.class);
if(s != null && s.length()>2 && counter !=0){
System.out.println("1");
references = new String[counter];
for(int i = 0 ; i < references.length ; i++){ references[i] = referencesList.get(i).getAsString();}
}else references = new String[]{"No previous references found"};
}
代码对我的需求工作得很好,但有没有其他方法可以更“正确”地做到这一点?
答案 0 :(得分:0)
if you wan to do this properly, you need before to create a pojo class for your json
public class ClassName{
private String code;
private String name;
private MyFile file;
......
}
public class MyFile{
private String author;
private String idx;
......
}
Now after that, you're ready to map your json on your pojo object, you can do it easly using jackson.
for your documentation
https://github.com/FasterXML/jackson-docs
So you need to add jackson on your project and you can do something like this for your mapping.
ObjectMapper mapper = new ObjectMapper();
String jsonInString = "{'name' : 'qdqsdqs'}";
//JSON from URL to Object
ClassName result = mapper.readValue(jsonInString , ClassName.class);
答案 1 :(得分:0)
一个好的开始是使用Json Parser解析Json。由于您正在使用Gson,因此您应该查看JsonParser
来进行解析。最好不要手动完成。
一些关键步骤包括:
JsonElement
file
的{{1}}成员,该成员又是JsonElement
并查看JsonElement
JsonElement
成员,你知道的是references
。 遍历JsonArray
并添加到字符串列表中。将字符串列表作为JsonArray
String[]
答案 2 :(得分:0)
我正在自己解析而不是这样做。所以我重写了一些部分,删除了计数器部分,然后发现了JSonArray的size()方法,我之前没有检查过。
我的最后一段代码更短,更容易阅读。
String[] references = null;
String repCode = "
{
"code":100,
"name":"3PVxkvfKyUiBg3LN24ek23KceGg6350KSkLZ.html",
"file":{
"author":"test@test",
"idx":"xihav-zupak-zonyf-bedid",
"name":"random",
"references":[
"relec-toluz",
"rosah-vyzyh",
"rikik-cinom"
]
}
}"
字符串repCode
是我从我查询的服务器获得的响应。
JsonObject file = new Gson().fromJson(repCode.get("file").toString(),JsonObject.class);
if(file.has("references") && file.get("references").isJsonArray()){
JsonArray referencesList = file.get("references").getAsJsonArray();
if(referencesList.size() != 0){
references = new String[referencesList.size()];
for(int i = 0 ; i < references.length ; i++){
references[i] = referencesList.get(i).getAsString();
}
}else references = new String[]{"No previous references found"};
}
最后显示:
for(String ref: references){
System.out.println("Ref: " + ref);
}
提供以下输出:
Ref: relec-toluz
Ref: rosah-vyzyh
Ref: rikik-cinom