GSON - 反序列化不区分大小写的字段名称(无确定大小写模式)

2022-09-03 09:30:08

我想构建一个灵活的api,我没有明确的区分大小写,用户可以通过,所以GSON必须能够在区分大小写的情况下反序列化它。

{"firstName":"Juan"}
{"firstname":"Juan"}
{"Firstname":"Juan"}
...

如何将这些字段反序列化为我的 Foo 名字?

public class Foo {
    private String firstName;
    //..getters
}

我试图使用FieldNamingPolicy,但它不起作用。

new GsonBuilder()
            .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
            .setPrettyPrinting()
            .create();

答案 1

有一种更简单的方法几乎可以得到你想要的东西。我没有意识到,但是由于GSON 2.4,注释支持GSON可以从中反序列化的备用名称数组。SerializedName

public class Foo {
    @SerializedName(value = "firstName", alternate = {"firstname", "Firstname"})
    private String firstName;

    public java.lang.String getFirstName() {
        return firstName;
    }

    @Override
    public String toString() {
        return "Foo:" + firstName;
    }
}

您可以使用它来支持可能的变体,而无法处理诸如“firSTNAme”之类的内容。

https://google.github.io/gson/apidocs/com/google/gson/annotations/SerializedName.html

看起来GSON似乎没有一个简单的内置方式来按照您想要的方式对其进行自定义。看起来从技术上讲,你可以实现一个使用反射来做到这一点,但它似乎过分了。TypeAdapterFactory

您可以使用 GSON 打开一个功能请求,内容涉及引入对支持备用名称或模式的字段命名策略的支持,或者不区分大小写的匹配。


答案 2

不是这个问题的完整解决方案,但如果键碰巧都是小写的,那么你可以实现接口headimgurlFieldNamingStrategy

Gson gson = new GsonBuilder().setFieldNamingStrategy(f -> f.getName().toLowerCase()).create();

将值解析为对象的字段。headImgUrl


推荐