Сериализация и десериализация JSON целевых JAVA классов с Джексоном - PullRequest
0 голосов
/ 26 марта 2020

Попытка десериализации / сериализации JSON в Java бинов, которые я создал. Действительно новый для Джексона и это стремление, так что терпите меня. У меня есть следующее:

{
  "foo": {
    "firstBlock": {
      "myValue": 1,
      "someBool": true,
      "stringValue": "OK"
    },
    "anotherBlock": {
      "values": [
        {
          "yikes01": 42
        },
        {
          "yikes02": 215
        }
      ],
      "myInt": 64,
      "logging": "Yes"
    }
  }
}

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

@JsonRootName("foo")
public class FooBean {
  private FirstBlockBean firstBlock;
  private AnotherBlockBean anotherBlock;

  @JsonGetter("firstBlock")
  public FirstBlockBean getFirstBlock() { return firstBlock; }

  @JsonSetter("firstBlock")
  public void setFirstBlock(FirstBlockBean firstBlock) { this.firstBlock = firstBlock; }

  @JsonGetter("anotherBlock")
  public AnotherBlockBean getAnotherBlock() { return anotherBlock; }

  @JsonSetter("firstBlock")
  public void setAnotherBlock(AnotherBlockBean anotherBlock) { this.anotherBlock = anotherBlock; }
}

@JsonRootName("firstBlock")
public class FirstBlockBean {

  private int myValue;
  private Boolean someBool;
  private String stringValue;

  @JsonGetter("myValue")
  public int getMyValue() { return myValue; }

  @JsonSetter("myValue")
  public void setMyValue(int myValue) { this.myValue = myValue; }

  @JsonGetter("someBool")
  public Boolean getSomeBool() { return someBool; }

  @JsonSetter("someBool")
  public void setSomeBool(Boolean someBool) { this.someBool = someBool; }

  @JsonGetter("stringValue")
  public String getStringValue() { return stringValue; }

  @JsonSetter("someBool")
  public void setStringValue(String stringValue) { this.stringValue = stringValue; }
}

... и класс AnotherBlockBean реализован аналогичным образом (для краткости опущен). Я использую Джексона для этого, и мой вопрос: есть ли в Джексоне механизм для сериализации и десериализации для этого случая? В идеале я хотел бы что-то вроде (псевдокод ниже, потому что я не смог ничего найти с помощью поисков или поисков Google здесь):

// Assume "node" contains a JsonNode for the tree and foo is an uninitialized FooBean class object.
JsonHelper.deserialize(node, FooBean.class, foo);

В этот момент я был бы возможность читать значения обратно:

int i = foo.getFirstBlock().getMyValue();
System.out.println("i = " + i); // i = 1

Точно так же я хотел бы иметь возможность взять экземпляр foo и сериализовать его обратно в JSON другим методом. Я мечтаю о том, чтобы получить такую ​​встроенную функциональность или она существует?

1 Ответ

0 голосов
/ 27 марта 2020

Основным классом при работе с Джексоном является ObjectMapper. У него много опций, взгляните на доступные методы.

Это пример типичного вспомогательного класса, который использует ObjectMapper для преобразования между Java объектами и строками.

public class JsonHelper {

    private ObjectMapper objectMapper;

    public JsonHelper(){

        this.objectMapper = new ObjectMapper();

        // Your mapping preferences here
        this.objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
        this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        this.objectMapper.setSerializationInclusion(Include.NON_NULL);
        this.objectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
    }

    public String serialize(Object object) {
        try {
            return this.objectMapper.writeValueAsString(object);
        } catch (Exception e) {
            // TODO Handle exception
            return null;
        }
    }

    public <T> T deserialize(String json, Class<T> clazz) {
        try {
            return this.objectMapper.readValue(json, clazz);
        } catch (Exception e) {
            // TODO Handle exception
            return null;
        }
    }

    public <T> T deserialize(String json, TypeReference<T> valueTypeRef) {
        try {

            return this.objectMapper.readValue(json, valueTypeRef);
        } catch (Exception e) {
            // TODO Handle exception
            return null;
        }
    }
}

Несколько советов:

  • Если имя методов получения и установки соответствует обычному соглашению, вы можете опустить аннотации @JsonGetter и @JsonSetter и просто использовать аннотацию @JsonProperty в объявлении поля.
  • Если имя поля java совпадает с именем узла в JSON, вы также можете опустить аннотацию @JsonProperty (Джексон отобразит JSON узлы и Java поля с соответствием имена).
...