如何使用多种返回类型解析JSON

时间:2018-05-01 18:24:53

标签: java json

我需要解析一个可以是任何类型的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();
            }
          }

}

但不能和我想要的一样 请帮助我

由于 此致

3 个答案:

答案 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 GSONMaven)。有了它,您可以使用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
   }
}