2017-02-06 6 views
0

Я ищу для поиска ArrayList JsonArrays для заданного значения. Ниже приведен пример данных, которые содержатся в моем ArrayList valueList:Java - Поиск ArrayList из JsonArrays

[ 
    [ 
    { 
     "blobJson": "x", 
     "deviceMfg": 10, 
     "eventCode": 0, 
     "sensorClass": 3, 
     "sensorUUID": "15633094", 
     "timeStamp": 1485433626.504731, 
     "uID": "15633094_3_10" 
    }, 
    { 
     "blobJson": "x", 
     "deviceMfg": 10, 
     "eventCode": 0, 
     "sensorClass": 3, 
     "sensorUUID": "19458142", 
     "timeStamp": 1483916820.538747, 
     "uID": "19458142_3_10" 
    }, 
    { 
     "blobJson": "x", 
     "deviceMfg": 10, 
     "eventCode": 1, 
     "sensorClass": 3, 
     "sensorUUID": "22808642", 
     "timeStamp": 1485937952.330456, 
     "uID": "22808642_3_10" 
    } 
    ] 
] 

Ищу искать через valueList для значения timeStamp поля и извлечь его, как я могу это сделать?

(я использую библиотеку GSON для разбора JSON)

+0

Ваш вопрос непонятен: пытаетесь ли вы найти определенное свойство и временную метку времени удержания или вам нужно отфильтровать его против определенного значения объекта (там, по крайней мере, три 'timeStamp's there) или вы пытаетесь извлечь временные метки? (Подсказка: возможно, вы, возможно, захотите использовать «Список <Список >', а не 'ArrayList '.) –

+0

Я просто пытаюсь извлечь временную метку. – Colin747

ответ

0

Если вы можете использовать Java 8, вы можете использовать API Streams для того, чтобы извлечь временные метки:

private static final TypeToken<List<List<JsonObject>>> listOfListOfJsonObjectsTypeToken = new TypeToken<List<List<JsonObject>>>() { 
}; 
final List<List<JsonObject>> arrays = gson.fromJson(JSON, listOfListOfJsonObjectsTypeToken.getType()); 
final List<Double> timestamps = arrays.stream() 
     .flatMap(Collection::stream) 
     .map(jo -> jo.get("timeStamp")) 
     .map(JsonElement::getAsJsonPrimitive) 
     .map(JsonPrimitive::getAsDouble) 
     .collect(toList()); 
System.out.println(timestamps); 

дает:

[1.485433626504731E9, 1.483916820538747E9, 1.485937952330456E9]


Edit:

Вы также хотите использовать JSON queryng библиотеки как JsonPath, который был разработан для запроса объектов JSON:

final DocumentContext context = JsonPath.parse(JSON); 
final JSONArray timestampsJsonArray = context.read(JsonPath.compile("$[0][*].timeStamp")); 
final List<Double> timestamps = timestampsJsonArray.stream() 
     .map(o -> (Number) o) 
     .map(Number::doubleValue) 
     .collect(toList()); 
System.out.println(timestamps); 

, который дал бы точно такой же результат.

Edit 2

Если нет JSON синтаксический/обработка не предполагается, вы можете использовать:

final List<Double> timeStamps = valueList.stream() 
     .flatMap(ja -> StreamSupport.stream(ja.spliterator(), false)) 
     .map(JsonElement::getAsJsonObject) 
     .map(jo -> jo.get("timeStamp")) 
     .map(JsonElement::getAsJsonPrimitive) 
     .map(JsonPrimitive::getAsDouble) 
     .collect(toList()); 
System.out.println(timeStamps); 

Результаты одинаковы.

+0

Что происходит вместо 'JSON' и' listOfListOfJsonObjectsTypeToken' в строке 'gson.fromJson (JSON, listOfListOfJsonObjectsTypeToken.getType());' – Colin747

+0

@ColinShewell 'JSON' - документ JSON, который вы предоставили в вопросе; 'listOfListOfJsonObjectsTypeToken' - поле' private static final', которое я упомянул в ответе. –

+0

Документ JSON в вопросе хранится как 'ArrayList', когда я помещаю это вместо' JSON', он дает метод не найденной ошибки. – Colin747