2015-11-25 2 views
1

Кто-нибудь слышал о библиотеке json, поддерживающей java8 Опционы при возврате значений?
Допустим, у меня есть следующие JSon документы:Библиотека JSON, возвращающая опции Java8?

{ 
    "person" : { 
    "address" : { 
     "streetName" : "Moonshtrasse", 
     "streetNo" : 12 
    } 
    } 
} 

и пустой документ

{} 

Если предположить методы Садись в возвратных OPTIONALS JSONObject, я хочу сделать что-то вроде этого:

Optional<String> streetName = obj.getJSONObject("person") 
    .flatMap(person -> person.getJSONObject("address")) 
    .flatMap(adr -> adr.getString("streetName")); 

Вместо проверки нулевых значений после каждого метода get.

В первом случае эта конструкция предоставит мне опцию, содержащую название улицы, а во втором случае даст мне пустой вариант.

+0

нет это на самом деле не – George

+0

другой поток относится к сериализации JSON и принятый ответ, что есть версия Джексона, который будет делать потребный .. .. поэтому на этот вопрос отвечает t шляпа нить. В этой теме есть еще одна тема: http://stackoverflow.com/questions/24547673/why-java-util-optional-is-not-serializable-how-to-serialize-the-object-with-suc – robjwilkins

+2

Используйте опцию «Необязательный. Неполный». – zeroflagL

ответ

1

Согласно документации по Факультативным :: карты,

If the mapping function returns a null result then this method returns an empty Optional. 

Таким образом, мы могли бы просто назвать методы неопределенных возвращающим как есть внутри лямбды прошли через Факультативный :: карты, вместо flatMapping Дополнительно-роскопия результаты сказала неопределенные возвращающих методы,

JSONObject obj = new JSONObject(someJsonString); 

Optional<String> streetName = Optional.ofNullable(obj.optJSONObject("person")) 
    .map(person -> person.optJSONObject("address")) 
    .map(address -> address.optString("streetName")) 
; 
+0

Да, это более краткий и элегантный – George

0

Что касается комментария от @zeroflagL, его подход применим, если бы у нас были методы, возвращающие нулевые значения, когда нужный элемент не существует.
Одна такая библиотека org.json
Есть методы opt, которые возвращают null, когда нет значений. Поэтому мы можем использовать опцию как:

JSONObject obj = new JSONObject(someJsonString); 

    Optional<String> streetName = Optional.ofNullable(obj.optJSONObject("person")) 
     .flatMap(person -> Optional.ofNullable(person.optJSONObject("address"))) 
     .flatMap(address -> Optional.ofNullable(address.optString("streetName"))); 

Это даст нам необходимый результат.

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