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
が、毎回同じエラーが発生します。
依存関係:
- JodaTime 2.6
- FasterXML の Jackson 2.5.0
- FasterXML のJackson-DataType- Joda 2.5.0
興味深いことに、その GitHub で、修飾子を使用して成功することを主張する単体テスト(" ") を見つけることができます。それがどのように機能する可能性があるのか わかりません。testLocalDateSer()
Include.NON_EMPTY