#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 это плохо продуманная структура данных, кем-то, кто не рассмотрел ее удобство использования.