2017-01-13 8 views
0

Я возвращаю массив JSON, который содержит много объектов, я ищу, чтобы иметь возможность искать атрибуты в каждом объекте, а затем возвращать объекты, соответствующие этому критерии.Java JSON/GSON - поиск всех объектов внутри массива и совпадение возврата

Я могу вернуть массив JSON, но у меня возникают проблемы с тем, как затем искать объекты в соответствии с значениями атрибутов для заданного значения.

Некоторые примеры значений из массива:

[ 
    {"blobJson":"x","deviceMfg":10,"eventCode":0,"sensorClass":3,"sensorUUID":"136199","timeStamp":1.48338464E9,"uID":"136199_3_10"}, 
    {"blobJson":"x","deviceMfg":10,"eventCode":0,"sensorClass":3,"sensorUUID":"136199","timeStamp":1.483379834470379E9,"uID":"136199_3_10"}, 
    {"blobJson":"x","deviceMfg":10,"eventCode":0,"sensorClass":3,"sensorUUID":"136199","timeStamp":1.483384639621985E9,"uID":"136199_3_10"} 
] 

Я использую следующий код, чтобы вернуть массив, который работает, как ожидалось:

JsonParser jp = new JsonParser(); 
    JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); 
    JsonArray rootArr = root.getAsJsonArray(); 

Следующий блок кода, что я Используется для поиска объекта по заданному значению атрибута, этот код работает, когда возвращается только объект, но дает ошибку, когда возвращается весь массив:

JsonObject rootObj = rootArr.getAsJsonObject(); 
    for (String attribute : attributes) { 
    System.out.println(rootObj.get(attribute).getAsString()); 
    } 

Это дает ошибку:

java.lang.IllegalStateException: Not a JSON Object: 

Я попытался изменить rootObj.get(attribute) к rootArr.get(attribute) но возвращает ошибку:

incompatible types: java.lang.String cannot be converted to int 

Это вызов метода:

method("136199", Arrays.asList("blobJson", "deviceMfg", "uID")); 

Объявление метода:

void method(String sensor, List<String> attributes) 

ответ

1

Проблема в том, что вы пытаетесь обработать JsonArray JsonObject. Попробуйте приведенный ниже код и посмотрите, работает ли он на вас. Точка интереса сейчас является - JsonObject rootObj = rootArr.get(0).getAsJsonObject();

public static void main(String[] args) { 

    String json = "[{\"blobJson\":\"x\",\"deviceMfg\":10,\"eventCode\":0,\"sensorClass\":3,\"sensorUUID\":\"136199\",\"timeStamp\":1.48338464E9,\"uID\":\"136199_3_10\"},{\"blobJson\":\"x\",\"deviceMfg\":10,\"eventCode\":0,\"sensorClass\":3,\"sensorUUID\":\"136199\",\"timeStamp\":1.483379834470379E9,\"uID\":\"136199_3_10\"},{\"blobJson\":\"x\",\"deviceMfg\":10,\"eventCode\":0,\"sensorClass\":3,\"sensorUUID\":\"136199\",\"timeStamp\":1.483384639621985E9,\"uID\":\"136199_3_10\"}]"; 

    JsonParser jp = new JsonParser(); 
    JsonElement root = jp.parse(json); 
    JsonArray rootArr = root.getAsJsonArray(); 

    JsonObject rootObj = rootArr.get(0).getAsJsonObject(); 
    rootObj.entrySet().forEach(entry -> System.out.println(entry.getKey()+": "+entry.getValue().getAsString())); 

} 
+0

Возвращаемый одну запись из таблицы, может быть, я должен был быть более ясным. Я хочу иметь возможность искать атрибут (например, «sensorClass = 3») и возвращать все объекты, соответствующие этим критериям. – Colin747

+0

Если я увеличиваю значение '.get (0)', это вернет каждый объект? – Colin747

+1

Точно вы можете использовать 'root.getAsJsonArray(). Size()' –

0

Вот что вы можете попробовать

try { 
    JSONArray jsonArray = new JSONArray(data); 
    for (int i = 0; i < jsonArray.length(); i++) { 
    Log.e("JSON Count", jsonArray.get(i).toString()); 
    } 
} catch (Exception e) { 
}