Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check if JSON is Object or Array

Is there a simple way in Go to check whether given JSON is either an Object {} or array []?

The first thing that comes to mind is to json.Unmarshal() into an interface, and then see if it becomes a map, or a slice of maps. But that seems quite inefficient.

Could I just check if the first byte is a { or a [? Or is there a better way of doing this that already exists.

like image 446
robbieperry22 Avatar asked Mar 06 '19 01:03

robbieperry22


People also ask

How do I know if a JSON object or JSON array?

You can check the character at the first position of the String (after trimming away whitespace, as it is allowed in valid JSON). If it is a { , you are dealing with a JSONObject , if it is a [ , you are dealing with a JSONArray .

How do you know if a response is an object or array?

The isArray() method returns true if an object is an array, otherwise false .


2 Answers

Use the following to detect if JSON text in the []byte value data is an array or object:

 // Get slice of data with optional leading whitespace removed.
 // See RFC 7159, Section 2 for the definition of JSON whitespace.
 x := bytes.TrimLeft(data, " \t\r\n")

 isArray := len(x) > 0 && x[0] == '['
 isObject := len(x) > 0 && x[0] == '{'

This snippet of code handles optional leading whitespace and is more efficient than unmarshalling the entire value.

Because the top-level value in JSON can also be a number, string, boolean or nil, it's possible that isArray and isObject both evaluate to false. The values isArray and isObject can also evaluate to false when the JSON is invalid.

like image 114
Bayta Darell Avatar answered Sep 23 '22 20:09

Bayta Darell


Use a type switch to determine the type. This is similar to Xay's answer, but simpler:

var v interface{}
if err := json.Unmarshal(data, &v); err != nil {
    // handle error
}
switch v := v.(type) {
case []interface{}:
    // it's an array
case map[string]interface{}:
    // it's an object
default:
    // it's something else
}
like image 23
user11157421 Avatar answered Sep 21 '22 20:09

user11157421