programing

Java에서의 JSON 오브젝트 해석

procenter 2022. 9. 18. 21:14
반응형

Java에서의 JSON 오브젝트 해석

JSON 오브젝트는 다음과 같습니다.

member = "{interests : [{interestKey:Dogs}, {interestKey:Cats}]}";

Java에서는 위의 json 객체를 해석하고 값을 배열 목록에 저장합니다.

나는 이것을 달성할 수 있는 몇 가지 코드를 찾고 있다.

목록에 interestKeys를 저장하려고 합니다.

org.json 라이브러리 사용:

JSONObject obj = new JSONObject("{interests : [{interestKey:Dogs}, {interestKey:Cats}]}");

List<String> list = new ArrayList<String>();
JSONArray array = obj.getJSONArray("interests");
for(int i = 0 ; i < array.length() ; i++){
    list.add(array.getJSONObject(i).getString("interestKey"));
}
public class JsonParsing {

public static Properties properties = null;

public static JSONObject jsonObject = null;

static {
    properties = new Properties();
}

public static void main(String[] args) {

    try {

        JSONParser jsonParser = new JSONParser();

        File file = new File("src/main/java/read.json");

        Object object = jsonParser.parse(new FileReader(file));

        jsonObject = (JSONObject) object;

        parseJson(jsonObject);

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

public static void getArray(Object object2) throws ParseException {

    JSONArray jsonArr = (JSONArray) object2;

    for (int k = 0; k < jsonArr.size(); k++) {

        if (jsonArr.get(k) instanceof JSONObject) {
            parseJson((JSONObject) jsonArr.get(k));
        } else {
            System.out.println(jsonArr.get(k));
        }

    }
}

public static void parseJson(JSONObject jsonObject) throws ParseException {

    Set<Object> set = jsonObject.keySet();
    Iterator<Object> iterator = set.iterator();
    while (iterator.hasNext()) {
        Object obj = iterator.next();
        if (jsonObject.get(obj) instanceof JSONArray) {
            System.out.println(obj.toString());
            getArray(jsonObject.get(obj));
        } else {
            if (jsonObject.get(obj) instanceof JSONObject) {
                parseJson((JSONObject) jsonObject.get(obj));
            } else {
                System.out.println(obj.toString() + "\t"
                        + jsonObject.get(obj));
            }
        }
    }
}}

1.), 이 경우에는인 toworld1)이경우 적절한목록을 작성합니다 어레이 유형의 적절한 형태의 arraylist를 만듭니다.String

2.)2)먼저 작성JSONObject반면 끈을 넘겨주면서에 문자열을 전달하다.JSONObject생성자로input입력으로서의 컨스트럭터

  • ~하듯이로서JSONObject표기법은 중괄호로 나타냅니다.
  • 어디 반면에.JSONArray표기법은 대괄호로 나타냅니다.

3.))취득 3검색합니다JSONArray부터에서JSONObject(2단계로 제정된)(두 번째 단계에서 작성)사용을 사용하여."interests"로 인덱스입니다.인덱스로서.

4.)트래버스 4)트래버스JASONArray를 사용하여 루프 배열의 길이에서 제공하는에 의해 제공되길이까지 루프를 사용합니다 배열 upto.length()기능 기능.

5.)의 취득 5검색합니다JSONObjects부터에서JSONArray사용을 사용하여.getJSONObject(index)기능 기능.

6.)정신 차리게 6에서 데이터를. 데이터 가져오기.JSONObject지수 '"interestKey"'을 사용하여.인덱스 'interestKey'를 사용합니다.

참고:주의: JSON구문 분석에서는 (보통 다른 JSON 응답 API에서) json 응답에 다음과 같은 "따옴표()가 포함되어 있는 경우 특수 중첩 문자의 이스케이프 시퀀스를 사용합니다.

`"{"key":"value"}"`

이래야 한다

`"{\"key\":\"value\"}"`

그래서사용하실 수 있습니다 사용할 수 있다.JSONParser안전 as안전을을 탈출한 순서 형식을 이루기 위해이스케이프시퀀스 포맷을 달성하다 위해.

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(inputString);

코드:

JSONParser parser = new JSONParser();
String response = "{interests : [{interestKey:Dogs}, {interestKey:Cats}]}";

JSONObject jsonObj = (JSONObject) parser.parse(response);

또는

JSONObject jsonObj = new JSONObject("{interests : [{interestKey:Dogs}, {interestKey:Cats}]}");

List<String> interestList = new ArrayList<String>();

JSONArray jsonArray = jsonObj.getJSONArray("interests");

for(int i = 0 ; i < jsonArray.length() ; i++){
    interestList.add(jsonArray.getJSONObject(i).optString("interestKey"));
}

주의: 경우에 따라서는 다음과 같은 예외가 표시될 수 있습니다.values are not available in appropriate type or is there is no mapping key그래서 이들 사건에서 당신의 가치의 존재에 대해 그렇게 가치의 존재에 대해 확신이 서지 않는 경우에는 사용하세요 따라서를 사용한다 확신하지 못한다.optString,optInt,optBooleanetc: 값이 존재하지 않는 경우 기본값을 반환하고 문자열 유형인 경우 int로 변환하려고 시도합니다.따라서 단순히 null 또는 number가 없습니다. 또는 값이 누락된 경우 예외 형식 지정

문서로부터

키와 관련된 선택적 문자열을 가져옵니다.이러한 키가 없는 경우 defaultValue를 반환합니다.

 public String optString(String key, String defaultValue) {
  String missingKeyValue = json_data.optString("status","N/A");
  // note there is no such key as "status" in response
  // will return "N/A" if no key found 

또는 빈 문자열을 가져오려면(키를 찾을 수 없는 경우)

  String missingKeyValue = json_data.optString("status");
  // will return "" if no key found where "" is an empty string

연구에 대한 추가 참조

다른 답변으로 @Code에 감사드립니다.당신의 코드 덕분에 어떤 JSON 파일도 읽을 수 있습니다.이제 모든 요소를 레벨별로 정리하려고 합니다.사용할 수 있습니다!

저는 안드로이드에서 URL에서 JSON을 읽고 있었는데 회선만 바꾸면 되었습니다.

Set<Object> set = jsonObject.keySet(); Iterator<Object> iterator = set.iterator();

위해서

Iterator<?> iterator = jsonObject.keys();

다른 사람을 돕기 위해 구현 내용을 공유합니다.

public void parseJson(JSONObject jsonObject) throws ParseException, JSONException {

    Iterator<?> iterator = jsonObject.keys();
    while (iterator.hasNext()) {
        String obj = iterator.next().toString();

        if (jsonObject.get(obj) instanceof JSONArray) {
            //Toast.makeText(MainActivity.this, "Objeto: JSONArray", Toast.LENGTH_SHORT).show();
            //System.out.println(obj.toString());
            TextView txtView = new TextView(this);
            txtView.setText(obj.toString());
            layoutIzq.addView(txtView);
            getArray(jsonObject.get(obj));
        } else {
            if (jsonObject.get(obj) instanceof JSONObject) {
                //Toast.makeText(MainActivity.this, "Objeto: JSONObject", Toast.LENGTH_SHORT).show();
                parseJson((JSONObject) jsonObject.get(obj));
            } else {
                //Toast.makeText(MainActivity.this, "Objeto: Value", Toast.LENGTH_SHORT).show();
                //System.out.println(obj.toString() + "\t"+ jsonObject.get(obj));
                TextView txtView = new TextView(this);
                txtView.setText(obj.toString() + "\t"+ jsonObject.get(obj));
                layoutIzq.addView(txtView);
            }
        }
    }
}

Java에서는 많은 JSON 라이브러리를 사용할 수 있습니다.

가장 악명 높은 것은 잭슨, 지슨, 겐슨, 패스트제이슨, 그리고 org.json이다.

라이브러리를 선택할 때는 일반적으로 다음 3가지 사항을 고려해야 합니다.

  1. 성능
  2. 사용하기 쉬움(코드는 쓰기 쉽고 읽기 쉬움) - 기능과 함께 사용할 수 있습니다.
  3. 모바일 앱의 경우: 종속성/항아리 크기

특히 JSON 라이브러리(및 모든 직렬화/비직렬화 libs)의 경우, 데이터 바인딩은 데이터를 포장/해제하기 위해 보일러 플레이트 코드를 작성할 필요가 없기 때문에 일반적으로도 중요합니다.

1에 대해서는, 다음의 벤치마크를 참조해 주세요.https://github.com/fabienrenaud/java-json-benchmark JMH를 사용하고 있습니다.JMH는 스트림 API와 databind API를 사용하여 시리얼라이저와 디시리얼라이저의 퍼포먼스(fastjson, org.json, jsonp)를 비교합니다.2번은 인터넷에서 여러 가지 예를 찾아볼 수 있습니다.위의 벤치마크를 예시로 사용할 수도 있습니다.

벤치마크의 간단한 설명: Jackson은 org.json보다 5~6배, GSON보다 2배 이상 뛰어난 성능을 발휘합니다.

특정 예에서는 다음 코드가 json을 잭슨으로 디코딩합니다.

public class MyObj {

    private List<Interest> interests;

    static final class Interest {
        private String interestKey;
    }

    private static final ObjectMapper MAPPER = new ObjectMapper();
    public static void main(String[] args) throws IOException {
        MyObj o = JACKSON.readValue("{\"interests\": [{\"interestKey\": \"Dogs\"}, {\"interestKey\": \"Cats\" }]}", MyObj.class);
    }
}

궁금한 점이 있으면 알려주세요.

언급URL : https://stackoverflow.com/questions/5015844/parsing-json-object-in-java

반응형