Gsonシーケンス化されたオブジェクトには、json形式のサブプロパティが含まれ、json列がエスケープされます.
3193 ワード
問題として、Gsonシーケンス化JavaオブジェクトにjsonStrのフィールドが格納されているjson形式の文字列、例えばデータベース自体に格納されているのがjson形式のvarcharである
jsonStr=
.
Gsonにはジャックソンはいない
@JsonRawValue
注釈.JsonRawValue:変換なしに属性値をjson文字列に書き込む.Jacksonを使用してjsonstrフィールドに直接注釈を付けるとよい.
1.Javaプロトタイプの使用方法
新しいオブジェクトにname,age,interestなどのプロパティを含め、jsonstrフィールドをオブジェクトに逆シーケンス化してから、オブジェクト全体をjson文字列にシーケンス化する必要があります.
2 .JsonSerializerオブジェクトをカスタマイズしてGsonのType Adapterに登録
反射を使用して値を割り当てることができます.これは、シーケンス化が必要なフィールドを直接書くことをテストするだけです.反射を使用して変換が必要なフィールドに注釈を付けるには、getメソッドの戻りタイプを判断する必要があります.
Gsonの作成
変換されたクラスがCallResultである場合にのみ、カスタム変換が実行されます.
jsonStr=
{"name":"chulainn","age":20,"interest":" "}
Gsonシーケンス化すると{\"name\":\"chulainn\",\"age\":20,\"interest\":\" \"}
はフロントエンドに戻ります.この現象を解決するには多中方式がある..
Gsonにはジャックソンはいない
@JsonRawValue
注釈.JsonRawValue:変換なしに属性値をjson文字列に書き込む.Jacksonを使用してjsonstrフィールドに直接注釈を付けるとよい.
1.Javaプロトタイプの使用方法
新しいオブジェクトにname,age,interestなどのプロパティを含め、jsonstrフィールドをオブジェクトに逆シーケンス化してから、オブジェクト全体をjson文字列にシーケンス化する必要があります.
2 .JsonSerializerオブジェクトをカスタマイズしてGsonのType Adapterに登録
public class CallResult{
private String name;
private int age;
private String jsonStr;
get() set()...
}
class CustomParserFoo implements
JsonSerializer
{
@Override
public JsonElement serialize(CallResult src,
Type typeOfSrc,
JsonSerializationContext context)
{
JsonObject element = new JsonObject();
JsonElement cachedArray = new JsonParser().parse(src.getJsonStr());
element.add("jsonStr", cachedArray);
element.addProperty("name",src.getName());
element.addProperty("age",src.getAge());
//element.addProperty();
System.out.println(CallResult.class.getDeclaredFields().length);
try {
int fieldLength = CallResult.class.getDeclaredFields().length;
Field[] fields = CallResult.class.getDeclaredFields();
for(int i = 0; i < fieldLength; i ++){
// Field field = fields[i];
// PropertyDescriptor pd = new PropertyDescriptor(field.getName(), src.getClass());
// Method rM = pd.getReadMethod();//
// String name = rM.getAnnotatedReturnType().getType().getTypeName();
// System.out.println("name:" + name);
//element.addProperty(field.getName(),);
}
}catch (Exception e){
e.printStackTrace();
}
return element;
}
}
反射を使用して値を割り当てることができます.これは、シーケンス化が必要なフィールドを直接書くことをテストするだけです.反射を使用して変換が必要なフィールドに注釈を付けるには、getメソッドの戻りタイプを判断する必要があります.
Gsonの作成
Gson gson = new GsonBuilder()
.registerTypeAdapter(CallResult.class,new CustomParserFoo()).create();
CallResult been = new CallResult();
been.setName("tony")
been.setAge(20);
been.setJsonStr("{\"name\":\"chulainn\",\"age\":20,\"interest\":\" \"}")
String result = gson.toJson(bean)
System.out.println(result)
{"jsonStr":{"name":"chulainn","age":20,"interest":" "},"name":"tony","age":20}
変換されたクラスがCallResultである場合にのみ、カスタム変換が実行されます.