fastjson はノードが JSONObject であるか JSONArray であるかをどのように判断しますか?

歴史的な理由と特殊なビジネス ロジックにより、次の 3 つの形式で 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 です。

判定方法についてですが、当初、百度検索で得られた結果は以下のような判定方法が多かったです。

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はエラーを報告します。

スレッド「メイン」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)
    com.alibaba.fastjson.parser.DefaultJSONParser.<init>(DefaultJSONParser.java:141)
    com.alibaba.fastjson.JSON.parse(JSON.java:180)
    com .alibaba.fastjson.JSON.parse(JSON.java:191)
    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");
        }

    }

ソースコードをざっと見て、主に validate() メソッドで判断しました。

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 を使用してノード タイプを決定できます。

おすすめ

転載: blog.csdn.net/wangkaichenjuan/article/details/130193845