Gsonシーケンス化されたオブジェクトには、json形式のサブプロパティが含まれ、json列がエスケープされます.

3193 ワード

問題として、Gsonシーケンス化JavaオブジェクトにjsonStrのフィールドが格納されているjson形式の文字列、例えばデータベース自体に格納されているのがjson形式のvarcharである
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である場合にのみ、カスタム変換が実行されます.