Nested JSON 결과의 다이내믹 JSON 키를 해석하려면 어떻게 해야 합니까?
다음 형식의 JSON 결과가 있는데, JSON Lint는 이것을 "유효한 응답"으로 표시합니다.
질문: "141", "8911" 등은 모두 동적 값이기 때문에 "question_mark"의 내용에 어떻게 액세스해야 합니까?
"product" 값에 액세스하기 위한 샘플 코드입니다.
//Consider I have the first <code>JSONObject</code> of the "search_result" array and
//I access it's "product" value as below.
String product = jsonObject.optString("product"); //where jsonObject is of type JSONObject.
//<code>product<code> now contains "abc".
JSON:
{
"status": "OK",
"search_result": [
{
"product": "abc",
"id": "1132",
"question_mark": {
"141": {
"count": "141",
"more_description": "this is abc",
"seq": "2"
},
"8911": {
"count": "8911",
"more_desc": "this is cup",
"seq": "1"
}
},
"name": "some name",
"description": "This is some product"
},
{
"product": "XYZ",
"id": "1129",
"question_mark": {
"379": {
"count": "379",
"more_desc": "this is xyz",
"seq": "5"
},
"845": {
"count": "845",
"more_desc": "this is table",
"seq": "6"
},
"12383": {
"count": "12383",
"more_desc": "Jumbo",
"seq": "4"
},
"257258": {
"count": "257258",
"more_desc": "large",
"seq": "1"
}
},
"name": "some other name",
"description": "this is some other product"
}
]
}
내 질문 제목 "동적 키"가 틀릴 수 있지만, 현 시점에서는 이 문제에 대해 어떤 이름이 더 좋은지 모르겠습니다.
어떤 도움이라도 주시면 감사하겠습니다!
JSONObject keys()를 사용하여 키를 얻은 후 각 키를 반복하여 동적 값을 얻습니다.
대략 코드는 다음과 같습니다.
// searchResult refers to the current element in the array "search_result" but whats searchResult?
JSONObject questionMark = searchResult.getJSONObject("question_mark");
Iterator keys = questionMark.keys();
while(keys.hasNext()) {
// loop to get the dynamic key
String currentDynamicKey = (String)keys.next();
// get the value of the dynamic key
JSONObject currentDynamicValue = questionMark.getJSONObject(currentDynamicKey);
// do something here with the value...
}
또 다른 방법은 Gson을 사용하는 것입니다(참고: 여기서는 getters/setters, toString 등을 생성하기 위해 lombok을 사용합니다).
package so7304002;
import java.util.List;
import java.util.Map;
import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class JsonDemo {
@Data
private static class MyMap {
private int count;
@SerializedName("more_description")
private String moreDescription;
private int seq;
}
@Data
private static class Product {
private String product;
private int id;
@SerializedName("question_mark")
private Map<String, MyMap> questionMark;
}
@Data
private static class MyObject {
private String status;
@SerializedName("search_result")
private List<Product> searchResult;
}
private static final String INPUT = ""; // your JSON
public static void main(final String[] arg) {
final MyObject fromJson = new Gson().fromJson(INPUT,
new TypeToken<MyObject>(){}.getType());
final List<Product> searchResult = fromJson.getSearchResult();
for (final Product p : searchResult) {
System.out.println("product: " + p.getProduct()
+ "\n" + p.getQuestionMark()+ "\n");
}
}
}
출력:
product: abc
{141=JsonDemo.MyMap(count=141, moreDescription=this is abc, seq=2),
8911=JsonDemo.MyMap(count=8911, moreDescription=null, seq=1)}
product: XYZ
{379=JsonDemo.MyMap(count=379, moreDescription=null, seq=5),
845=JsonDemo.MyMap(count=845, moreDescription=null, seq=6),
12383=JsonDemo.MyMap(count=12383, moreDescription=null, seq=4),
257258=JsonDemo.MyMap(count=257258, moreDescription=null, seq=1)}
질문의 JSON 데이터:
{
"status": "OK",
"search_result": [
{
"product": "abc",
"id": "1132",
"question_mark": {
"141": {
"count": "141",
"more_description": "this is abc",
"seq": "2"
},
"8911": {
"count": "8911",
"more_desc": "this is cup",
"seq": "1"
}
},
"name": "some name",
"description": "This is some product"
},
{
"product": "XYZ",
"id": "1129",
"question_mark": {
"379": {
"count": "379",
"more_desc": "this is xyz",
"seq": "5"
},
"845": {
"count": "845",
"more_desc": "this is table",
"seq": "6"
},
"12383": {
"count": "12383",
"more_desc": "Jumbo",
"seq": "4"
},
"257258": {
"count": "257258",
"more_desc": "large",
"seq": "1"
}
},
"name": "some other name",
"description": "this is some other product"
}
]
}
코드 예:
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
public class GsonExercise {
public static void main(String[] args) {
String jsonString = "{\"status\":\"OK\",\"search_result\":[{\"product\":\"abc\",\"id\":\"1132\",\"question_mark\":{\"141\":{\"count\":\"141\",\"more_description\":\"this is abc\",\"seq\":\"2\"},\"8911\":{\"count\":\"8911\",\"more_desc\":\"this is cup\",\"seq\":\"1\"}},\"name\":\"some name\",\"description\":\"This is some product\"},{\"product\":\"XYZ\",\"id\":\"1129\",\"question_mark\":{\"379\":{\"count\":\"379\",\"more_desc\":\"this is xyz\",\"seq\":\"5\"},\"845\":{\"count\":\"845\",\"more_desc\":\"this is table\",\"seq\":\"6\"},\"12383\":{\"count\":\"12383\",\"more_desc\":\"Jumbo\",\"seq\":\"4\"},\"257258\":{\"count\":\"257258\",\"more_desc\":\"large\",\"seq\":\"1\"}},\"name\":\"some other name\",\"description\":\"this is some other product\"}]}";
JsonObject jobj = new Gson().fromJson(jsonString, JsonObject.class);
JsonArray ja = jobj.get("search_result").getAsJsonArray();
ja.forEach(el -> {
System.out.println("product: " + el.getAsJsonObject().get("product").getAsString());
JsonObject jo = el.getAsJsonObject().get("question_mark").getAsJsonObject();
jo.entrySet().stream().forEach(qm -> {
String key = qm.getKey();
JsonElement je = qm.getValue();
System.out.println("key: " + key);
JsonObject o = je.getAsJsonObject();
o.entrySet().stream().forEach(prop -> {
System.out.println("\tname: " + prop.getKey() + " (value: " + prop.getValue().getAsString() + ")");
});
});
System.out.println("");
});
}
}
출력:
product: abc
key: 141
name: count (value: 141)
name: more_description (value: this is abc)
name: seq (value: 2)
key: 8911
name: count (value: 8911)
name: more_desc (value: this is cup)
name: seq (value: 1)
product: XYZ
key: 379
name: count (value: 379)
name: more_desc (value: this is xyz)
name: seq (value: 5)
key: 845
name: count (value: 845)
name: more_desc (value: this is table)
name: seq (value: 6)
key: 12383
name: count (value: 12383)
name: more_desc (value: Jumbo)
name: seq (value: 4)
key: 257258
name: count (value: 257258)
name: more_desc (value: large)
name: seq (value: 1)
GSON에서도 같은 작업을 할 수 있지만 GSON 컨버터 어댑터를 사용하여 POJO로 변환하는 대신 수동으로 해석합니다.동적 JSON 데이터의 경우 유연성을 제공합니다.
제 경우 JSON 포맷은 다음과 같습니다.
{
"dateWiseContent": {
"02-04-2017": [
{
"locality": " Cross Madian Cross Rd No 4"
}
],
"04-04-2017": [
{
"locality": "Dsilva Wadi"
},
{
"locality": " Cross Madian Cross Rd No 4",
"appointments": []
}
]
}
}
이 경우 dateWiseContent에는 동적 객체 키가 있으므로 JsonParser 클래스를 사용하여 이 json 문자열을 해석합니다.
//parsing string response to json object
JsonObject jsonObject = (JsonObject) new JsonParser().parse(resource);
//getting root object
JsonObject dateWiseContent = jsonObject.get("dateWiseContent").getAsJsonObject();
사용하여 다이내믹 키를 취득하다Map.Entry<String, JsonElement>
아래와 같이
// your code goes here
for (Map.Entry<String, JsonElement> entry : dateWiseContent.entrySet()) {
//this gets the dynamic keys
String dateKey = entry.getKey();
//you can get any thing now json element,array,object according to json.
JsonArray jsonArrayDates = entry.getValue().getAsJsonArray();
int appointmentsSize = jsonArrayDates.size();
for (int count = 0; count < appointmentsSize; count++) {
JsonObject objectData = jsonArrayDates.get(count).getAsJsonObject();
String locality = objectData.get("locality").getAsString();
}
}
마찬가지로 동적 json의 모든 레벨은 다음을 사용하여 구문 분석할 수 있습니다.Map.Entry<String,JsonElement>
이 논리를 사용할 수 있습니다.org.json 라이브러리 사용
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20211205</version>
</dependency>
public void parseJson(JSONObject jo, String key) {
Iterator<?> keyIterator;
String key1;
if (jo.has(key)) {
System.out.println(jo.get(key));
} else {
keyIterator = jo.keys();
while (keyIterator.hasNext()) {
key1 = (String) keyIterator.next();
if (jo.get(key1) instanceof JSONObject) {
if (!jo.has(key))
parseJson(jo.getJSONObject(key1), key);
} else if (jo.get(key1) instanceof JSONArray) {
JSONArray jsonarray = jo.getJSONArray(key1);
Iterator<?> itr = jsonarray.iterator();
while (itr.hasNext()) {
String arrayString = itr.next().toString();
JSONObject jo1 = new JSONObject(arrayString);
if (!jo1.has(key)) {
parseJson(jo1, key);
}
}
}
}
}
}
언급URL : https://stackoverflow.com/questions/7304002/how-to-parse-a-dynamic-json-key-in-a-nested-json-result
'programing' 카테고리의 다른 글
CRA에서 오픈브라우저를 비활성화하려면 어떻게 해야 하나요? (0) | 2023.02.13 |
---|---|
UI와 비즈니스 로직을 분리하는 Reactjs (0) | 2023.02.13 |
Angularjs 입력 필드 포커스 이벤트? (0) | 2023.02.13 |
반응 아폴로 오류:불변 위반:컨텍스트에서 "클라이언트"를 찾을 수 없거나 옵션으로 전달되었습니다. (0) | 2023.02.13 |
jQuery.ajax 및 FormData를 사용하여 파일을 업로드하는 방법 (0) | 2023.02.13 |