我試圖用Java實現一個JSON序列化與Genson 1.3多態類型,包括:Genson多態/通用序列化
Number
小號- 陣列
Enum
類
下面的SSCCE大致顯示了我試圖實現的目標:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.owlike.genson.Genson;
import com.owlike.genson.GensonBuilder;
/**
* A Short, Self Contained, Compilable, Example for polymorphic serialization
* and deserialization.
*/
public class GensonPolymoprhicRoundTrip {
// our example enum
public static enum RainState {
NO_RAIN,
LIGHT_RAIN,
MODERATE_RAIN,
HEAVY_RAIN,
LIGHT_SNOW,
MODERATE_SNOW,
HEAVY_SNOW;
}
public static class Measurement<T> {
public T value;
public int qualityValue;
public String source;
public Measurement() {
}
public Measurement(T value, int qualityValue, String source) {
this.value = value;
this.qualityValue = qualityValue;
this.source = source;
}
}
public static class DTO {
public List<Measurement<?>> measurements;
public DTO(List<Measurement<?>> measurements) {
this.measurements = measurements;
}
}
public static void main(String... args) {
Genson genson = new GensonBuilder()
.useIndentation(true)
.useRuntimeType(true)
.useClassMetadataWithStaticType(false)
.addAlias("RainState", RainState.class)
.useClassMetadata(true)
.create();
DTO dto = new DTO(
new ArrayList(Arrays.asList(
new Measurement<Double>(15.5, 8500, "TEMP_SENSOR"),
new Measurement<double[]>(new double[] {
2.5,
1.5,
2.0
}, 8500, "WIND_SPEED"),
new Measurement<RainState>(RainState.LIGHT_RAIN, 8500, "RAIN_SENSOR")
)));
String json = genson.serialize(dto);
System.out.println(json);
DTO deserialized = genson.deserialize(json, DTO.class);
}
}
號和陣列行之有效外的開箱,但枚舉類是提供一個小小的挑戰。在這種情況下,序列化JSON形式必須是IMO一個JSON對象包括:
- 類型成員
- value成員
望着EnumConverter
類我看到,我需要提供自定義Converter
。不過,我不能完全掌握如何正確註冊Converter
,以便它在反序列化被調用。如何用Genson解決這個序列化問題?
我實現了一個基於此的解決方案和[工廠]的javadocs(http://owlike.github.io/genson/Documentation/Javadoc/com/owlike/genson/Factory.html)和[ChainedFactory](http ://owlike.github.io/genson/Documentation/Javadoc/com/owlike/genson/convert/ChainedFactory.html),其中還提供了相關的代碼示例。 –