2015-05-16 1 views
0

У меня есть данные в формате JSON в следующем формате:Как извлечь значение массива внутри вложенных данных JSON

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

Я хочу, чтобы получить строку в поле «email_domains». Я написал следующий код, как моя попытка:

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

В этом коде, чтобы получить «email_domains» только объект массива JSON создается, что получить данные из объекта JSON, а затем его итератора используется для получения значений внутри массив. Тем не менее, он выбрасывает исключение NullPointerException в этой строке:

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

Я застреваю из-за этой проблемы. Может ли кто-нибудь предложить решение?

+0

Является ли jsonObject внешним объектом или объектом данных? т. е. вы выполнили 'jsonObject = (JSONObject) something.get (" data ");', или вам просто нужно это сделать? –

+0

Как ваш код даже компилируется? JSONArray не имеет метода iterator(). – stackoverflowuser2010

+0

Вы извлекаете «email_domains» из переменной jsonObject, а не извлекаете ее из dataObject2. dataObject2.get ("name"); dataObject2.get ("is_organization"); ¿jsonObject? .get ("email_domains"); ??? – Chuidiang

ответ

2

Если вы используете библиотеку JSON из http://www.json.org/java/, то вы не должны использовать JSONObject.get() так часто. В библиотеке есть другие методы для получения конкретных типов, таких как getLong(), getJSONArray() и т. Д. В вашем случае с полем "email_domains", вы должны попробовать:

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

попробовать это, чтобы принести "email_domains"

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

или

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

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

Мое решение? Я не хочу, чтобы кто-то предлагал решение в другой библиотеке ... но загляните в сборники google и помощник Gson. Он может превратить ваш Json в карту для вас, а затем снова вернуться к json, когда вы закончите.

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

JsonArray 's может быть брошен в List' s

0

"email_address" является JSONArray поэтому мы должны принести это, как

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

, потому что нет метода с именем getJSONArray –

+0

Моя ошибка при использовании .. try 'dataObject2.getJSONArray (" email_domains ");' – Kushal

+0

Ваше вышеописанное решение не работает –

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

} 
Смежные вопросы