Abdul Majid Bajwa
Abdul Majid Bajwa

Reputation: 159

How to extract array values within nested JSON data

I have JSON data in the following format:

{
  "data": {
    "id": 14810798216415,
    "name": "crescentbahuman.com",
    "is_organization": true,
    "email_domains": [
      "crescentbahuman.com"
    ]
  }
}

I want to get the string in the "email_domains" field. I wrote the following code as my attempt:

        JSONObject dataObject2= (JSONObject)jsonObject2.get("data");

        long id =  (long) dataObject2.get("id");
        System.out.println("worksapce id is: " + id);

        String name = (String) dataObject2.get("name");
        System.out.println("The worksapce name is: " + name);

        boolean is_organization = (boolean) dataObject2.get("is_organization");
        System.out.println("The workspace is organization: " + is_organization);            

        JSONArray email_domains = (JSONArray) jsonObject2.get("email_domains");

       Iterator<String> iterator = email_domains.iterator();
       while (iterator.hasNext()) {
        System.out.println(iterator.next());
       }

In this code to get "email_domains" only, a JSON Array object is created that get data from the JSON object and then its iterator is used to get values from within the array. However, it throws a NullPointerException on this line:

Iterator<String> iterator = email_domains.iterator();

I am stuck due to this problem. Can anyone kindly suggest a solution?

Upvotes: 0

Views: 3643

Answers (6)

Safwan Hijazi
Safwan Hijazi

Reputation: 2089

Use this implementation

import java.lang.reflect.Field;
import java.util.List;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class JsonConvertor {

private static GsonBuilder gsonBuilder;
private static Gson gson;

private JsonConvertor() {

}
public static Object fromJson(String json, Class clz)
{
    gson=new Gson();
    return gson.fromJson(json,clz);
}

public static String toJson(Object obj) {
    gsonBuilder = new GsonBuilder();
    gsonBuilder = gsonBuilder
            .addSerializationExclusionStrategy(new CustomIclusionStrategy(
                    obj.getClass()));
    gson = gsonBuilder.create();
    String json = gson.toJson(obj);
    return json;
}

}

class CustomIclusionStrategy implements ExclusionStrategy {

private Class classToIclude;

private Field[] declaredFields;


private List<FieldAttributes> fields;

public CustomIclusionStrategy(List<FieldAttributes> fields) {
    this.fields = fields;
}

public CustomIclusionStrategy(Class classToIclude) {
    this.classToIclude = classToIclude;
    this.declaredFields=classToIclude.getDeclaredFields();

}

// called only if shouldSkipClass returns false
@Override
public boolean shouldSkipField(FieldAttributes f) {

    try {
        classToIclude.getSuperclass().getDeclaredField(f.getName());
        System.out.println(f.getName());
        return true;
    } catch (Exception e) {
    } 
    return false;

}

@Override
public boolean shouldSkipClass(Class<?> clazz) {
    // if returns false shouldSkipField will be called, otherwise 
  //shouldSkipField will not be called
    return false;
 }
}



public class Org {
private Data data;

public Org(Data data) {
    super();
    this.data = data;
}

public Data getData() {
    return data;
}

public void setData(Data data) {
    this.data = data;
}

public String toJson()
{
    return JsonConvertor.toJson(this);
}
public static void main(String[] args) {

    String json="{\"data\": {\"id\":\"1\",\"name\":\"org1\",\"is_organization\":true,\"email_domains\":   [\"email1\",\"email2\",\"email3\",\"email4\"]}}";

    Org o=(Org) JsonConvertor.fromJson(json, Org.class);

    System.out.println(o.getData().getEmail_domains());
}

}

Upvotes: 0

Kushal
Kushal

Reputation: 8478

"email_address" is JSONArray so we need to fetch this like

JSONArray email_domains = (JSONArray) dataObject2.getJSONArray("email_domains");
email_domains.get(0); // this will return crescentbahuman.com

Upvotes: 0

user3337036
user3337036

Reputation: 41

org.json.JSONArray email_domains = (org.json.JSONArray) json.get("email_domains");
int length = email_domains.length();
 for(int i = length-1; i > 0; i--) {
    org.json.JSONObject jsonData = (org.json.JSONObject) email_domains.get(i);
    System.out.println(jsonData);
}

Upvotes: 1

JohnTrack
JohnTrack

Reputation: 399

try this to fetch "email_domains"

JSONArray email_domains = ((JSONArray) jsonObject).get("email_domains");

or

JSONObject obj = new JSONObject(jsonObject.Tostring());

JSONArray email_domains = obj.optJSONArray("email_domains");

Upvotes: 0

stackoverflowuser2010
stackoverflowuser2010

Reputation: 40909

If you are using the JSON library from http://www.json.org/java/, then you should not be using JSONObject.get() so frequently. The library has other methods to get specific types, such as getLong(), getJSONArray(), and so forth. For your case with the "email_domains" field, you should try:

JSONArray array = dataObject2.getJSONArray("email_domains");
String value = array.getString(0);

Upvotes: 2

Richard Smith
Richard Smith

Reputation: 144

My solution? I hate to be someone to offer a solution in another library... but look into google collections and the Gson helper. It can turn your Json into a map for you, and then back to json again when you are done.

Map map = gson.fromJson(jsonText, Map.class);

JsonArray's can then be cast into List's

Upvotes: 0

Related Questions