Обновите элемент JSON до NULL, если он содержит определенное значение

Полиморфизм буквально означает несколько форм. (или много форм): объект из разных классов и метод с тем же именем, но рабочие процессы разные. Простым примером может быть:

Рассмотрим человека X.

Он всего лишь один человек, но он действует как много. Вы можете спросить, как:

Он сын своей матери. Друг своим друзьям. Брат сестре.

0
задан Muruga Balu 5 March 2019 в 07:41
поделиться

1 ответ

Самый гибкий способ, которым я мог придумать, - это использовать аннотацию Джексона JsonAnyGetter . Это позволяет вам предоставить Джексону Map представление о состоянии вашего pojo. фильтрация значений из Map может быть выполнена итеративным способом. фильтрация значений из Map, содержащего Map с, может быть выполнена рекурсивным способом.

Вот решение, которое я построил на основе предложенного вопроса

public class Claim {
    Map<String, Object> properties = new HashMap<>();

    public Claim() {
        // may be populated from instance variables
        Map<String, String> person = new HashMap<>();
        person.put("name", "Sam");
        person.put("surname", "ngonma");
        properties.put("person", person);
        Map<String, String> car = new HashMap<>();
        car.put("make", "Toyota");
        car.put("model", "yaris");
        properties.put("car", car);
    }

    // nullify map values based on provided array
    public void filterProperties (String[] nullifyValues) {
        filterProperties(properties, nullifyValues);
    }

    // nullify map values of provided map based on provided array
    @SuppressWarnings("unchecked")
    private void filterProperties (Map<String, Object> properties, String[] nullifyValues) {
        // iterate all String-typed values
        // if value found in array arg, nullify it
        // (we iterate on keys so that we can put a new value)
        properties.keySet().stream()
            .filter(key -> properties.get(key) instanceof String)
            .filter(key -> Arrays.asList(nullifyValues).contains(properties.get(key)))
            .forEach(key -> properties.put(key, null));
        // iterate all Map-typed values
        // call this method on value
        properties.values().stream()
            .filter(value -> value instanceof Map)
            .forEach(value -> filterProperties((Map<String, Object>)value, nullifyValues));
    }

    // provide jackson with Map of all properties
    @JsonAnyGetter
    public Map<String, Object> getProperties() {
        return properties;
    }
}

, метод испытания

,
public static void main(String[] args) {
    try {
        ObjectMapper mapper = new ObjectMapper();
        Claim claim = new Claim();
        claim.filterProperties(new String[]{"Sam", "Toyota"});
        System.out.println(mapper.writeValueAsString(claim));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
,

, вывод

,

, {"car":{"model":"yaris","make":null},"person":{"surname":"ngonma","name":null}},

.
0
ответ дан Sharon Ben Asher 5 March 2019 в 07:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: