¿Cómo determina fastjson si un nodo es JSONObject o JSONArray?

Por razones históricas y una lógica empresarial especial, existe una interfaz que devuelve cadenas json en los siguientes tres formatos:

{     "código": 200,     "datos": "xxxxxxx",     "msg": "éxito" }



{     "code": 200,     "data": {         "info": {             "title": "xxx",             "desc": "xxx"         },         "ext": {             "desc": "xxx"         }     },     " mensaje": "éxito"











{     "código": 200,     "datos": [{         "título": "xxx",         "desc": "xxx"     }, {         "título": "xxx",         "desc": "xxx"     }],     " mensaje": "éxito"









Debajo del nodo de datos, puede ser una cadena pura, un JSONObject o un JSONArray. Lo que tenemos que hacer ahora es escribir un método, analizar este json y ensamblar un valor de retorno unificado para llamadas externas. El problema El punto es cómo determinar si el nodo de datos es una cadena, JSONObject o JSONArray. 

Requisito previo, la versión utilizada por fastjson es 1.2.83

Hablemos del método de juicio: al principio, la mayoría de los resultados obtenidos por la búsqueda de Baidu estaban en el siguiente método de juicio:

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");
        }
    }

 En el método de escritura anterior, normalmente se puede juzgar si el nodo de datos es JSONObject o JSONArray, pero si el nodo de datos es directamente una cadena pura, JSON.parse informará un error:

Excepción en el hilo "principal" com.alibaba.fastjson.JSONException: estado ilegal. x
    en com.alibaba.fastjson.parser.JSONLexerBase.scanHex(JSONLexerBase.java:5109)
    en com.alibaba.fastjson.parser.JSONLexerBase.nextToken(JSONLexerBase.java:203)
    en com.alibaba.fastjson.parser.DefaultJSONParser. <init>(DefaultJSONParser.java:170)
    en com.alibaba.fastjson.parser.DefaultJSONParser.<init>(DefaultJSONParser.java:141)
    en com.alibaba.fastjson.JSON.parse(JSON.java:180)
    en com .alibaba.fastjson.JSON.parse(JSON.java:191)
    en com.alibaba.fastjson.JSON.parse(JSON.java:147)

 Más tarde, busqué en el github de fastjson y descubrí que JSONValidator se puede utilizar para emitir juicios. El código es el siguiente:

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");
        }

    }

Después de mirar brevemente el código fuente, hice el juicio principalmente a través del método validar ().

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;
}

Para obtener un código más específico y detallado, vaya al almacén fastjson y compruébelo usted mismo.

Conclusión final:

Usando fastjson en java, puede usar JSONValidator para determinar el tipo de nodo

Supongo que te gusta

Origin blog.csdn.net/wangkaichenjuan/article/details/130193845
Recomendado
Clasificación