Java — получение различного количества переменных json

#java #json

#java #json

Вопрос:

Я создаю инструмент с использованием Java, который обращается к API.

Я пытаюсь позволить пользователю решать, какие параметры использовать (например, с помощью флажков).

Таким образом, пользователь решил бы использовать один из, скажем, 5 параметров:

 p1
p2
p3
p4
p5
  

и затем я бы вызвал API, используя эти параметры, и получил строку Json в качестве ответа.

Таким образом, строка Json может быть либо

 {"data":[{"p1":"value1", "p2":"value2", "p3":"value3", "p4":"value4", "p5":"value5"}]}
{"data":[{"p1":"value1", "p2":"value2", "p3":"value3", "p4":"value4"}]}
{"data":[{"p1":"value1", "p2":"value2", "p3":"value3"}]}
{"data":[{"p1":"value1", "p2":"value2"}]}
or
{"data":[{"p1":"value1"}]}
  

Я пытаюсь распечатать все, что находится внутри «данных», на консоль. Это код, который я получил до сих пор:

 JsonParser parser = new JsonParser();
JsonObject json = (JsonObject) 
parser.parse(adsInsights.toString());
System.out.println(json.get("p1").getAsString()   "t" 
          json.get("p2").getAsString()   "t" 
          json.get("p3").getAsString()   "t" 
          json.get("p4").getAsString()   "t"  
        json.get("p5").getAsString()
);
  

Моя проблема в том, как мне определить, какие из них печатать, не выполняя кучу if / elses?

Все, что мне нужно, это каждая переменная в «данных». есть ли способ сделать это?

Редактировать:

Прежде всего, спасибо за все ответы.

Для дальнейшего использования, я думаю, это то, что я сделал:

 //getting the keys, which the user has selected. Detailed implementation irrelevant for this matter
String selectedKeys[] = getSelectedKeys(); 

JsonParser parser = new JsonParser();
JsonObject json = (JsonObject) 
parser.parse(adsInsights.toString());
for(int i = 0; i < selectedKeys.length; i  ) {
    if(json.has(selectedKeys[i])) {
        System.out.print(json.get(selectedKeys[i]).getAsString()   "t");
    }
}
System.out.println();
  

Ответ №1:

Вы можете перебирать ключи Json независимо от того, какие ключи в нем есть, и печатать их значения.

 JsonParser parser = new JsonParser();
JsonObject json = (JsonObject) 
parser.parse(adsInsights.toString());

for (key: json.keys) {
            System.out.print(json.get(key).getAsString());
        }
  

Комментарии:

1. на самом деле «json.keys» не существует, но я понял идею. Спасибо

Ответ №2:

 // to check if key exists or not. if not, return empty string.
private String getValues(JSONObject jsonObj, String arg) {
        return jsonObj.get(arg) != null?(String) jsonObj.get(arg):"";
    }

  
 //call getValues function for every key. fetch all keys from keySet Function.
JSONObject check=(JSONObject) obj;
JSONObject data=(JSONObject) check.get("data");
Set<String> keys=data.keySet();
for(String k:keys){
            System.out.println(getValues(data,k));
}
  

Комментарии:

1. на данный момент я выбрал что-то вроде этого. оказывается, уже существует метод проверки. json.has(key) возвращает значение true, если ключ существует внутри объекта. поэтому я бы перебрал строки, выбранные пользователем, и напечатал, имеет ли значение json.has (key) значение true

Ответ №3:

Вы также создаете API?

Я думаю, что лучшей структурой данных для возврата из API было бы использование массива для «данных», например

 {
  "data":[ 
    { "id": "p1", "value": "value1" }, 
    { "id": "p2", "value": "value2" }, 
    { "id": "p3", "value": "value3" }, 
    { "id": "p4", "value": "value4" }, 
    { "id": "p5", "value": "value5" }
  ]
}
  

Таким образом, принимающий код не должен заботиться о том, какие элементы находятся в data или сколько. Вместо этого он может просто перебирать массив и печатать все, что там есть.

Комментарии:

1. я не создаю API, и да, это на самом деле массив. я просто перепутал скобки. собираюсь отредактировать это. меня интересует часть «напечатать все, что там окажется». как именно мне это сделать

2. использование цикла, как я упоминал выше. простой for цикл будет просто перебирать столько элементов, сколько существует в массиве на данный момент. Если их нет, цикл повторится 0 раз. Если их 100, цикл повторится 100 раз.

3. о, подождите. я думаю, что я что-то неправильно понял. все p1-p5 находятся внутри одного и того же объекта

4. итак, по сути, у меня есть изменяющийся объект, а не массив различной длины

5. Видел ваше обновление … хорошо, теперь есть массив, но это по сути бессмысленно, поскольку он содержит один объект, который затем содержит все значения в качестве ключей объекта. Это просто глупо. Возможно, вы не создаете API, но есть ли у вас отношения с людьми, которые это делают? Возможно, вы можете предположить, что они обеспечивают вывод в более удобной структуре. Если они действительно по какой-то причине не сдвинутся с места, то, я думаю, вы можете пойти с ответом, который предлагает перебирать все ключи в объекте, но IMO это плохо продуманная структура данных, кем-то, кто не рассмотрел ее удобство использования.