如何在嵌套的JSON数据中提取数组值

时间:2015-05-16 05:47:03

标签: java json parsing

我有以下格式的JSON数据:

Require Import ZArith.
Open Scope Z.
Theorem fooZ:
    forall x y z:Z, x + y - z = x + (y - z).
    intros; omega.
Qed.

我想在" email_domains"中获取字符串。领域。我写了以下代码作为我的尝试:

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

在此代码中获取" email_domains"只创建一个JSON Array对象,从JSON对象获取数据,然后使用其迭代器从数组中获取值。但是,它会在此行上抛出NullPointerException:

        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());
       }

由于这个问题我被困住了。有人可以提出解决方案吗?

6 个答案:

答案 0 :(得分:2)

如果您使用http://www.json.org/java/中的JSON库,则不应频繁使用JSONObject.get()。该库还有其他方法来获取特定类型,例如getLong(),getJSONArray()等。对于您使用&#34; email_domains&#34;字段,你应该尝试:

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

答案 1 :(得分:1)

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);
}

答案 2 :(得分:0)

尝试此操作以获取“email_domains”

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

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

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

答案 3 :(得分:0)

我的解决方案?我讨厌成为某人在另一个图书馆提供解决方案......但是请查看谷歌馆藏和Gson助手。它可以让你的Json成为你的地图,然后当你完成后再回到json。

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

JsonArray然后可以投放到List

答案 4 :(得分:0)

“email_address”是 JSONArray 所以我们需要像

一样取这个
JSONArray email_domains = (JSONArray) dataObject2.getJSONArray("email_domains");
email_domains.get(0); // this will return crescentbahuman.com

答案 5 :(得分:0)

使用此实现

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());
}

}