fastjson은 노드가 JSONObject인지 JSONArray인지 어떻게 결정합니까?

역사적인 이유와 특별한 비즈니스 로직으로 인해 다음 세 가지 형식으로 json 문자열을 반환하는 인터페이스가 있습니다.

{     "코드": 200,     "데이터": "xxxxxxx",     "msg": "성공" }



{     "코드": 200,     "데이터": {         "정보": {             "제목": "xxx",             "desc": "xxx"         },         "ext": {             "desc": "xxx"         }     },     " msg": "성공"











{     "코드": 200,     "데이터": [{         "제목": "xxx",         "desc": "xxx"     }, {         "제목": "xxx",         "desc": "xxx"     }],     " msg": "성공"









데이터 노드 아래에는 순수 문자열, JSONObject 또는 JSONArray가 있을 수 있으며, 이제 우리가 해야 할 일은 메서드를 작성하고, 이 json을 구문 분석하고, 외부 호출에 대한 통합된 반환 값을 조합하는 것입니다. 데이터 노드가 문자열, JSONObject 또는 JSONArray인지 확인하는 방법. 

전제 조건, fastjson에서 사용되는 버전은 1.2.83입니다.

판단 방법에 대해 이야기하자면, 처음에는 Baidu 검색으로 얻은 대부분의 결과가 다음과 같은 판단 방법이었습니다.

public static void main(String[] args) {
        String objStr = "{\"code\":200,\"data\":{\"info\":{\"title\":\"xxx\",\"desc\":\"xxx\"},\"ext\":{\"desc\":\"xxx\"}},\"msg\":\"success\"}";
        String aryStr = "{\"code\":200,\"data\":[{\"title\":\"xxx\",\"desc\":\"xxx\"},{\"title\":\"xxx\",\"desc\":\"xxx\"}],\"msg\":\"success\"}";
        String spStr = "{\"code\":200,\"data\":\"xxxxxxx\",\"msg\":\"success\"}";

        JSONObject jsonObject = JSON.parseObject(spStr);
        Object object = JSON.parse(jsonObject.getString("data"));
        if (object instanceof JSONObject) {
            System.out.println("JSONObject");
        } else if (object instanceof JSONArray) {
            System.out.println("JSONArray");
        } else {
            System.out.println("string");
        }
    }

 위의 작성 방법에서는 데이터 노드가 JSONObject인지 JSONArray인지 정상적으로 판단할 수 있지만, 데이터 노드가 직접 순수 문자열 문자열인 경우 JSON.parse는 오류를 보고합니다.

스레드 "main" com.alibaba.fastjson.JSONException의 예외: 잘못된 상태입니다. x
    com.alibaba.fastjson.parser.JSONLexerBase.scanHex(JSONLexerBase.java:5109)
    com.alibaba.fastjson.parser.JSONLexerBase.nextToken(JSONLexerBase.java:203)
    com.alibaba.fastjson.parser.DefaultJSONParser. <init>(DefaultJSONParser.java:170)
    at com.alibaba.fastjson.parser.DefaultJSONParser.<init>(DefaultJSONParser.java:141)
    at com.alibaba.fastjson.JSON.parse(JSON.java:180)
    at com .alibaba.fastjson.JSON.parse(JSON.java:191)
    at com.alibaba.fastjson.JSON.parse(JSON.java:147)

 나중에 fastjson의 github을 검색해 보니 JSONValidator를 사용하여 판단할 수 있다는 것을 알았습니다. 코드는 다음과 같습니다.

public static void main(String[] args) {
        String objStr = "{\"code\":200,\"data\":{\"info\":{\"title\":\"xxx\",\"desc\":\"xxx\"},\"ext\":{\"desc\":\"xxx\"}},\"msg\":\"success\"}";
        String aryStr = "{\"code\":200,\"data\":[{\"title\":\"xxx\",\"desc\":\"xxx\"},{\"title\":\"xxx\",\"desc\":\"xxx\"}],\"msg\":\"success\"}";
        String spStr = "{\"code\":200,\"data\":\"xxxxxxx\",\"msg\":\"success\"}";

        JSONObject jsonObject = JSON.parseObject(spStr);
        JSONValidator validator = JSONValidator.from(jsonObject.getString("data"));
        JSONValidator.Type jsonType = validator.getType();
        System.out.println(jsonType);
        if (jsonType == JSONValidator.Type.Object) {
            System.out.println("JSONObject");
        } else if (jsonType == JSONValidator.Type.Array) {
            System.out.println("JSONArray");
        } else {
            System.out.println("string");
        }

    }

소스코드를 간략히 살펴본 후 주로 verify() 메소드를 통해 판단을 내렸습니다.

public boolean validate() {
    if (validateResult != null) {
        return validateResult;
    }

    for (;;) {
        if (!any()) {
            validateResult = false;
            return false;
        }
        skipWhiteSpace();

        count++;
        if (eof) {
            validateResult = true;
            return true;
        }

        if (supportMultiValue) {
            skipWhiteSpace();
            if (eof) {
                break;
            }
            continue;
        } else {
            validateResult = false;
            return false;
        }
    }

    validateResult = true;
    return true;
}

보다 구체적이고 자세한 코드는 fastjson 웨어하우스에 가셔서 직접 살펴보시기 바랍니다.

최종 결론:

Java에서 fastjson을 사용하면 JSONValidator를 사용하여 노드 유형을 결정할 수 있습니다.

Guess you like

Origin blog.csdn.net/wangkaichenjuan/article/details/130193845