Обновите элемент JSON до NULL, если он содержит определенное значение - PullRequest
0 голосов
/ 05 марта 2019

У меня есть JSON, который выглядит следующим образом:

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

Я пишу это в Amazon SQS со следующими строками:

ObjectMapper mObjectMapper = new ObjectMapper();
sqsExtended.sendMessage(new SendMessageRequest(awsSQSUrl, mObjectMapper.writeValueAsString(claim)));

У меня есть отдельный массив значений, еслиJSON имеет значение в этом массиве. Я должен записать поле как null.

Если мой строковый массив равен ["Sam", "Toyota"], мой окончательный JSON должен выглядеть следующим образом:

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

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

1 Ответ

0 голосов
/ 05 марта 2019

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

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

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}}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...