我需要解析一个可以是任何类型的JSON。
返回的数据可能非常复杂,但我只需要获取该JSON对象或数组中使用的值字符串
JSON数据的示例是
https://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote?format=json
到目前为止,我所做的是:
public class UrlActions {
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
InputStream is = new URL(url).openStream();
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = new JSONObject(jsonText);
return json;
} finally {
is.close();
}
}
}
但不能和我想要的一样 请帮助我
由于 此致
答案 0 :(得分:0)
你应该在json中有一个对象类型的类,然后你可以使用像Jackson的ObjectMapper这样的库来读取值,例如
List<Quote> quotes = objectMapper.readValue(yourjson, new TypeReference<List<Quote>>(){});
答案 1 :(得分:0)
对于具有键和类型字符串值的结构,可以使用以下代码。
String json = "{\"name\":\"Shepherd\", \"age\":26}";
Map<String, Object> map = new HashMap<String, Object>();
// convert JSON string to Map
map = mapper.readValue(json, new TypeReference<Map<String, String>>(){});
现在你可以做到:
map.get(key) //Here map.get("name")
对于您想要检索的任何内容。无论您在上一个答案中指出的情况如何,您都需要提供合适的类型参考。
注意:我在这里使用杰克逊。
答案 2 :(得分:0)
如果您不知道JSON中的内容(因此您无法使用类解析它),则可以执行Google GSON(Maven)。有了它,您可以使用JsonToken迭代JSON文件,以了解接下来的内容。
JsonReader reader = new JsonReader(new FileReader(inputfile));
while (reader.hasNext()) {
JsonToken currentToken = reader.peek();
switch (currentToken) {
case BEGIN_OBJECT:
// read "{"
reader.beginObject();
break;
case END_OBJECT:
// read "}"
reader.endObject();
break;
case BEGIN_ARRAY:
// read "["
reader.beginArray();
break;
case END_ARRAY:
// read "]"
reader.endArray();
break;
case END_DOCUMENT:
// end of document
break;
default:
reader.nextName(); // that gives "key"
// next gives "values"
reader.nextNull();
reader.nextString();
reader.nextBoolean();
// there others like nextLong(), nextInt() but i recommand you
// to check if JsonToken.NUMBER, take the value in string
// then parse it in the numeric class you want
}
}