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
    依赖于使用
    JsonElement
    实现的JSON树模型表示。这意味着必须将整个JSON加载到内存中,并在使用它之前构建它的树模型。如果要处理的JSON对象很大,这将消耗更多内存
  • toString()
    也是一个错误的选择:它要求首先生成内部字符串,从而再次消耗内存
因此,上面的项目可能会产生非常大的内存打印。为了节省内存资源,您可以创建一个Gson
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]}