programing

GSON을 사용하여 Android에서 동적 "키" 및 "값"을 가진 JSON 구문 분석

magicmemo 2023. 3. 2. 22:10
반응형

GSON을 사용하여 Android에서 동적 "키" 및 "값"을 가진 JSON 구문 분석

저는 현재 json 파일을 반환하는 웹 서비스를 호출해야 하는 Android 프로젝트를 진행하고 있습니다.GSON 라이브러리를 사용하여 모든 json 파일을 해석하고 JSON 객체를 가져옵니다.키 필드가 동적인 이 json 데이터를 발견하기 전까지는 잘 작동하고 있었습니다.이 파일의 예는 다음과 같습니다.

{ "0": { "count":"5"},
  "1": { "title":"...", "desc":"" },
  "2": { "title":"...", "desc":"" },
  "3": { "title":"...", "desc":"" },
  "4": { "title":"...", "desc":"" },
  "5": { "title":"...", "desc":"" },
  "routes": { "route1":"...", "route3":"" },
}

키 ID "0"을 기준으로 카운트를 얻을 수 있지만, 이 값을 사용하여 필요한 데이터로 구성된 다른 키 오브젝트(키 ID 1~5)를 얻는 방법을 모르겠습니다.이 문제에 대해 누군가 저를 도와줄 수 있다면 정말 감사하겠습니다.감사해요.

내가 생각할 수 있는 가장 간단한 접근법은 단지 구조물을 하나의 구조물로 취급하는 것이다.Map(의Map).

Gson을 사용하면 이 작업은 비교적 간단합니다.Map구조는 정적으로 알려져 있으며 루트로부터의 모든 브랜치는 같은 깊이를 가지며 모든 것은String.

import java.io.FileReader;
import java.lang.reflect.Type;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class GsonFoo
{
  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    Type mapType = new TypeToken<Map<String,Map<String, String>>>() {}.getType();
    Map<String,Map<String, String>> map = gson.fromJson(new FileReader("input.json"), mapType);
    System.out.println(map);

    // Get the count...
    int count = Integer.parseInt(map.get("0").get("count"));

    // Get each numbered entry...
    for (int i = 1; i <= count; i++)
    {
      System.out.println("Entry " + i + ":");
      Map<String, String> numberedEntry = map.get(String.valueOf(i));
      for (String key : numberedEntry.keySet())
        System.out.printf("key=%s, value=%s\n", key, numberedEntry.get(key));
    }

    // Get the routes...
    Map<String, String> routes = map.get("routes");

    // Get each route...
    System.out.println("Routes:");
    for (String key : routes.keySet())
      System.out.printf("key=%s, value=%s\n", key, routes.get(key));
  }
}

더욱 역동적인Map구조 처리, 잭슨이 임의의 복잡성의 JSON 오브젝트를 Java로 역직렬화 할 것이기 때문에 Gson 대신 Jackson을 사용하도록 전환할 것을 강력히 제안합니다.Map단순한 코드 한 줄만으로도 원시 값의 유형을 자동으로 유지합니다.

import java.io.File;
import java.util.Map;

import org.codehaus.jackson.map.ObjectMapper;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    Map map = mapper.readValue(new File("input.json"), Map.class);
    System.out.println(map);
  }
}

Gson에서도 마찬가지이지만 수십 줄의 코드가 필요합니다.(게다가 Gson은 잭슨으로의 전환이 충분히 가치가 있는 다른 단점도 있습니다.)

카운트를 사용하여 개별 주요 개체를 가져올 수 있습니다.오브젝트 "1"을 취득한 후 오브젝트 "title"과 "desc"를 취득하고 오브젝트 "2" 등을 취득합니다.

언급URL : https://stackoverflow.com/questions/6796662/using-gson-to-parse-a-json-with-dynamic-key-and-value-in-android

반응형