Как разобрать 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();
            }
          }

}

но не может быть тем же, что я хочу Пожалуйста, помогите мне

Спасибо С Уважением

В чем проблема?

SLaks 01.05.2018 20:26

мне нужно получить все значения, такие как «имя»: «USD / KRW», «цена»: «1072,229980», «символ»: «KRW = X», «ts»: «1525199087», «тип»: » currency »,« utctime »:« 2018-05-01T18: 24: 47 + 0000 »,« volume »:« 0 »

Adeel Faisal 01.05.2018 20:30

ОК; в чем проблема?

SLaks 01.05.2018 20:32

данные, которые я получаю, возвращаются для всего объекта json, мне просто нужны значения, такие как USD / KRW или 1072.229980 и т. д., только значения, а не ключи или объекты json или массивы json

Adeel Faisal 01.05.2018 20:36

Посмотри сюда может быть - stackoverflow.com/questions/9151619/…

OldProgrammer 01.05.2018 20:38

Вам нужно выучить Как разобрать JSON в Java.

naXa 01.05.2018 20:43
Пожалуйста, сделайте больше исследований, затем опубликуйте то, что вы пробовали с рабочим четкое объяснение того, чего нет и предоставление Минимальный, полный и проверяемый пример. Прочтите Как задать хороший вопрос. Обязательно взять тур и прочтите это.
adprocas 01.05.2018 21:02

Вам действительно нужно разобрать любой JSON, который можно вообразить? Или вы хотите извлечь определенные данные из определенного объекта JSON?

user9455968 01.05.2018 21:08

@LutzHorn мне нужно проанализировать любые данные, не относящиеся к JSON

Adeel Faisal 01.05.2018 21:14

Почему? Что вы будете делать с данными, если не знаете их структуру и ее значение?

user9455968 01.05.2018 21:17

@LutzHorn, моя идея - просто вставить URL-адрес API, получить все значения результатов и сохранить их в электронной таблице, чтобы URL-адрес мог быть другим

Adeel Faisal 01.05.2018 21:20

JSON не плоский, как электронная таблица. Как вы планируете сопоставить сложный вложенный объект JSON?

user9455968 01.05.2018 21:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
12
330
3

Ответы 3

у вас должен быть класс типа объектов в 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
   }
}

Другие вопросы по теме