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