无法正确检测到JSON对象

时间:2018-08-26 04:00:36

标签: java json

我正在尝试检测我的字符串是JSON对象还是JSON数组。 这是我的示例:

jsonObject = "{"key":"value1", "id":"1"}";
jsonArray = "[{"key":"value0", "id":"0"},{"key":"value1", "id":"1"}]"

已正确检测到JSON数组,但JSON对象不正确。 这是我的代码:

import com.jayway.jsonpath.Configuration;
import net.minidev.json.JSONArray;
import net.minidev.json.JSONObject;

public class json {
    public static void main(String[] args) {
        String jsonObject = "{\"key\":\"value1\", \"id\":\"1\"}";
        Object documentObject = Configuration.defaultConfiguration().jsonProvider().parse(jsonObject);
        // Why is documentObject not recognized as an object?
        if (documentObject instanceof JSONArray) {
            System.out.println("jsonObject is JSONArray");
        } else if (documentObject instanceof JSONObject) {
            System.out.println("jsonObject is JSONObject");
        } else {
            System.out.println("jsonObject is UNKNOWN");
        }

        String jsonArray = "[{\"key\":\"value0\", \"id\":\"0\"},{\"key\":\"value1\", \"id\":\"1\"}]";
        Object documentArray = Configuration.defaultConfiguration().jsonProvider().parse(jsonArray);
        // jsonArray is recognized properly
        if (documentArray instanceof JSONArray) {
            System.out.println("jsonArray is JSONArray");
        } else if (documentArray instanceof JSONObject) {
            System.out.println("jsonArray is JSONObject");
        } else {
            System.out.println("jsonArray is UNKNOWN");
        }

    }
}

输出: jsonObject是未知的 jsonArray是JSONArray

怎么了?

1 个答案:

答案 0 :(得分:1)

首先,正如@Henry指出的那样,如果要区分JSON对象和JSON数组,简单的方法是检查第一个非空白字符。

关于您的代码为何不起作用的原因,看来parse(jsonObject)返回的是LinkedHashMap的实例。至少这是我在以下版本中看到的内容:

  <dependencies>
    <dependency>
        <groupId>com.jayway.jsonpath</groupId>
        <artifactId>json-path</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
      <groupId>net.minidev</groupId>
      <artifactId>json-smart</artifactId>
      <version>2.3</version>
    </dependency>
  </dependencies>

事实证明,这是jayway jsonpath库的默认行为。默认配置指定JSON对象的顺序感知表示。使用json-smart,可以将其实现为LinkedHashMap

因此,对JSON对象的测试(如果以此方式进行,请使用这些库读取JSON)应该是:

    if (object instanceof Map) {
        System.out.println("object is a JSON object");
    }