0

Java オブジェクトを JSON にシリアライズしようとしています。Java オブジェクトの 1 つに、フィールドの 1 つとして JodaTimeLocalTimeオブジェクトがあります。

私のJavaオブジェクトのかなりの数には、Collection空になる可能性のあるさまざまなフィールドもあります。次のような JSON のシリアル化を防止したい:

{id: 2348904, listOfThings: [], listOfStuff: [], nowASet: []}

Collectionこれら 3 つの s が空であるこのシナリオでは、むしろ次の JSON が表示されます。

{id: 2348904}

このようなことを行う正しい方法はObjectMapper、次のコード行でを構成することです。

objectMapper.setSerializationInclusion(Include.NON_EMPTY);

これは問題なく機能します...そのJavaオブジェクトをそのLocalTime内部でヒットするまで。それが私が実際に得るときですjava.lang.StackOverflowError

JodaDateSerializerBase.isEmpty()と の間でピンポンしているようJsonSerializer.isEmpty()です。ただし、お互いに電話しないため、方法はわかりません。

次のように、SSSSSSCCCCEEEE、または頭字語が何であれ、なんとか作成しました。

package whatever.you.like;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.joda.JodaModule;
import org.joda.time.LocalTime;
import org.junit.Test;

public class TestClass {
  public class JodaMapper extends ObjectMapper {
    private static final long serialVersionUID = 34785437895L;

    public JodaMapper() {
      registerModule(new JodaModule());
    }

    public boolean getWriteDatesAsTimestamps() {
      return getSerializationConfig().isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    }

    public void setWriteDatesAsTimestamps(boolean state) {
      configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, state);
    }
  }

  private class Thing {
    private LocalTime localTime;

    public Thing() {}

    public void setLocalTime(LocalTime localTime) {
      this.localTime = localTime;
    }

    public LocalTime getLocalTime() {
      return localTime;
    }
  }

  @Test
  public void extendObjectMapperTest() throws JsonProcessingException {
    JodaMapper objectMapper = new JodaMapper();
    objectMapper.setWriteDatesAsTimestamps(false);
    objectMapper.setSerializationInclusion(Include.NON_EMPTY);
    Thing thing = new Thing();
    LocalTime localTime = new LocalTime(12389340L);
    thing.setLocalTime(localTime);
    System.out.println("Never manages to print this out: " + objectMapper.writeValueAsString(thing));
  }

  @Test
  public void configureObjectMapperTest() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JodaModule());
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    objectMapper.setSerializationInclusion(Include.NON_EMPTY);
    Thing thing = new Thing();
    LocalTime localTime = new LocalTime(12389340L);
    thing.setLocalTime(localTime);
    System.out.println("Never manages to print this out: " + objectMapper.writeValueAsString(thing));
  }
}

ObjectMapperの拡張と構成の両方を試みましたObjectMapperが、毎回同じエラーが発生します。

依存関係:

興味深いことに、その GitHub で、修飾子を使用して成功することを主張する単体テスト(" ") を見つけることができます。それがどのように機能する可能性があるのか​​ わかりません。testLocalDateSer()Include.NON_EMPTY

4

1 に答える 1