Gson的javax.json序列化程序/反序列化程序
我正在尝试为Gson的javax.json序列化程序/反序列化程序,java,json,serialization,gson,javax.json,Java,Json,Serialization,Gson,Javax.json,我正在尝试为java.javax.JsonObjects编写一个通用的Gson序列化程序/反序列化程序: 公共静态类JavaxJsonObjConverter实现JsonSerializer、JsonDeserializer{ @凌驾 公共JsonObject反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{ 返回JsonUtils.getJsonObjectFromString(jso
java.javax.JsonObject
s编写一个通用的Gson序列化程序/反序列化程序:
公共静态类JavaxJsonObjConverter实现JsonSerializer、JsonDeserializer{
@凌驾
公共JsonObject反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
返回JsonUtils.getJsonObjectFromString(json.toString());
}
@凌驾
公共JsonElement序列化(JsonObject src,类型typeOfSrc,JsonSerializationContext){
返回新的JsonParser().parse(src.toString());
}
}
当我尝试序列化java.json.JsonObject
时,出现以下错误:
Exception in thread "main" java.lang.ClassCastException: org.glassfish.json.JsonStringImpl cannot be cast to javax.json.JsonObject
at om.headlandstech.utils.gson_utils.GsonUtils$JavaxJsonValueConverter.serialize(>GsonUtils.java:1)
at com.google.gson.internal.bind.TreeTypeAdapter.write(TreeTypeAdapter.java:81)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapte>rFactory.java:208)
at ....
如果您也发布
javax.json.JsonObject
实例(它们是按照构建的方式)会更好。因为:我能用的最接近的方法是:
final Gson Gson=new GsonBuilder()
.registerTypeAdapter(JsonObject.class,新的JavaxJsonObjConverter())
.create();
最终JsonObject src=Json.createObjectBuilder()
添加(“foo”、“bar”)
.build();
System.out.println(gson.toJson(src.get(“foo”),JsonObject.class));
例外情况:
Exception in thread "main" java.lang.ClassCastException: org.glassfish.json.JsonStringImpl cannot be cast to javax.json.JsonObject
at q43376802.Q43376802$JavaxJsonObjConverter.serialize(Q43376802.java:29)
at com.google.gson.internal.bind.TreeTypeAdapter.write(TreeTypeAdapter.java:81)
at com.google.gson.Gson.toJson(Gson.java:669)
at com.google.gson.Gson.toJson(Gson.java:648)
at com.google.gson.Gson.toJson(Gson.java:603)
at q43376802.Q43376802.main(Q43376802.java:26)
下一件事。您的JavaxJsonObjConverter
实现了javax.json.JavaObject
(反)序列化程序,但是javax.json.JavaObject
不是javax.json
中json对象的根。层次结构根是JsonValue
。因此,(反)序列化程序必须处理JsonValue
,而不是JsonObject
公共静态类JavaxJsonValConverter
实现JsonSerializer{
@凌驾
公共JsonElement序列化(最终JsonValue JsonValue、最终类型类型、最终JsonSerializationContext){
返回新的JsonParser().parse(jsonValue.toString());
}
}
并将其注册为完全删除JavaxJsonObjConverter
:
.registerTypeAdapter(JsonValue.class,新的JavaxJsonValConverter())
但是,上面的序列化程序很简单,需要更多的资源,但是,这给了您一些灵活性(当直接从JSON流读取/写入JSON流时,可能太不合理了(比较XML中的DOM和SAX,情况是一样的)):
和JsonSerializer
依赖于使用JsonDeserializer
实现的JSON树模型表示。这意味着必须将整个JSON加载到内存中,并在使用它之前构建它的树模型。如果要处理的JSON对象很大,这将消耗更多内存JsonElement
也是一个错误的选择:它要求首先生成内部字符串,从而再次消耗内存toString()
TypeAdapter
,它可以处理JSON流(这是JSON中每个(反)序列化器的基础)
final类JsonValueTypeAdapter
扩展类型适配器{
私有静态最终类型适配器jsonValueTypeAdapter=新jsonValueTypeAdapter();
私有JsonValueTypeAdapter(){
}
静态类型适配器getJsonValueTypeAdapter(){
返回jsonValueTypeAdapter;
}
@凌驾
公共无效写入(最终JsonWriter out,最终JsonValue JsonValue)
抛出IOException{
最终值类型ValueType=jsonValue.getValueType();
开关(valueType){
案例阵列:
JsonArrayTypeAdapter.instance.write(out,(JsonArray)jsonValue);
打破
案例对象:
JsonObjectTypeAdapter.instance.write(out,(JsonObject)jsonValue);
打破
大小写字符串:
JsonStringTypeAdapter.instance.write(out,(JsonString)jsonValue);
打破
案件编号:
JsonNumberTypeAdapter.instance.write(out,(JsonNumber)jsonValue);
打破
大小写正确:
JsonBooleanTypeAdapter.instance.write(out,jsonValue);
打破
案例错误:
JsonBooleanTypeAdapter.instance.write(out,jsonValue);
打破
大小写为空:
JsonNullTypeAdapter.instance.write(out,jsonValue);
打破
违约:
抛出新的断言错误(valueType);
}
}
@凌驾
公共JsonValue读取(中的最终JsonReader)
抛出IOException{
最终JsonToken JsonToken=in.peek();
开关(jsonToken){
案例开始\u数组:
返回JsonArrayTypeAdapter.instance.read(in);
案例结束单元阵列:
抛出新的AssertionError(“由于委托给数组类型适配器,因此决不能发生”);
案例开始对象:
返回JsonObjectTypeAdapter.instance.read(in);
案例结束对象:
抛出新的断言错误(“由于委托给对象类型适配器,因此决不能发生”);
案例名称:
抛出新断言错误(“决不能发生”);
大小写字符串:
返回JsonStringTypeAdapter.instance.read(in);
案件编号:
返回JsonNumberTypeAdapter.instance.read(in);
大小写布尔值:
返回JsonBooleanTypeAdapter.instance.read(in);
大小写为空:
返回JsonNullTypeAdapter.instance.read(in);
案例结束文件:
抛出新断言错误(“决不能发生”);
违约:
抛出新断言错误(jsonToken);
}
}
私有静态最终类JsonNullTypeAdapter
扩展类型适配器{
private static final-TypeAdapter实例=新的JsonNullTypeAdapter().nullSafe();
@凌驾
@抑制警告(“资源”)
公共无效写入(最终JsonWriter out,最终JsonValue jsonNull)
抛出IOException{
out.nullValue();
}
@凌驾
before.toString() = {"boolean":true,"integer":3,"string":"foo","null":null,"array":[false,2,"bar",null]}
type adapter result = {"boolean":true,"integer":3,"string":"foo","null":null,"array":[false,2,"bar",null]}
after.toString() = {"boolean":true,"integer":3.0,"string":"foo","null":null,"array":[false,2.0,"bar",null]}