Мне нужно разобрать 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();
}
}
}
но не может быть тем же, что я хочу Пожалуйста, помогите мне
Спасибо С Уважением
мне нужно получить все значения, такие как «имя»: «USD / KRW», «цена»: «1072,229980», «символ»: «KRW = X», «ts»: «1525199087», «тип»: » currency »,« utctime »:« 2018-05-01T18: 24: 47 + 0000 »,« volume »:« 0 »
ОК; в чем проблема?
данные, которые я получаю, возвращаются для всего объекта json, мне просто нужны значения, такие как USD / KRW или 1072.229980 и т. д., только значения, а не ключи или объекты json или массивы json
Посмотри сюда может быть - stackoverflow.com/questions/9151619/…
Вам нужно выучить Как разобрать JSON в Java.
Вам действительно нужно разобрать любой JSON, который можно вообразить? Или вы хотите извлечь определенные данные из определенного объекта JSON?
@LutzHorn мне нужно проанализировать любые данные, не относящиеся к JSON
Почему? Что вы будете делать с данными, если не знаете их структуру и ее значение?
@LutzHorn, моя идея - просто вставить URL-адрес API, получить все значения результатов и сохранить их в электронной таблице, чтобы URL-адрес мог быть другим
JSON не плоский, как электронная таблица. Как вы планируете сопоставить сложный вложенный объект JSON?
у вас должен быть класс типа объектов в json, тогда вы можете использовать библиотеки, такие как ObjectMapper Джексона, для чтения значений, например
List<Quote> quotes = objectMapper.readValue(yourjson, new TypeReference<List<Quote>>(){});
Для структуры, которая имеет ключ и значение как строки типа, можно использовать приведенный ниже код.
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")
для всего, что вы хотите получить. Однако в вашем случае, как указано в предыдущем ответе, вам необходимо предоставить подходящие ссылки на типы.
ПРИМЕЧАНИЕ: здесь я использую Джексона.
Если вы не знаете, что находится в JSON (поэтому вы не можете разобрать его с помощью класса), вы можете взять Google GSON (Maven). При этом вы можете перебирать файл JSON с помощью JsonToken, чтобы знать, что будет дальше.
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
}
}
В чем проблема?