GSON无法读取/映射名称为USERid的字段

时间:2020-07-01 12:47:36

标签: gson resttemplate

来自客户端的响应(休息呼叫)具有JSON元素,如USERId。 相关的java变量如下

@JsonProperty("USERId")
private String uSERId;

我正在使用spring RestTemplate进行此rest调用,并用于从JSON映射到JAVA,我正在使用GSON。 我已经完全排除了jackson databind,它是spring rest模板的默认映射器,如下所示。

this.getMessageConverters().removeIf(converter -> converter.getClass().getName().equals(MappingJackson2HttpMessageConverter.class.getName()));
GsonHttpMessageConverter messageConverter = new GsonHttpMessageConverter();
messageConverter.setGson(gson);
this.getMessageConverters().add(messageConverter);

这样,我确保仅将GSON用于映射。

当我直接点击邮递员的客户休息服务时,我看到该文件具有一个值-“ USERId”:“ 025076373”。 但是RestTemplate的响应对象没有此字段,即所有其他具有正确Java规范命名的字段均已正确映射。 我的意思是respone对象中的所有其他字段都映射有响应json中的值。响应对象没有uSERId或相应的值。

我相信这个问题可能是由于命名约定很奇怪,但是对于MappingJackson2HttpMessageConverter来说,它也可以正常工作。

我尝试通过编写适配器并将其分配给gsonBuilder,然后将其设置为GsonHttpMessageConverter来进行调试。

gsonBuilder.registerTypeHierarchyAdapter(String.class, new StringTypeAdapter().nullSafe())

在调试适配器时,我可以看到除USERId之外的所有其他字段。

jackson databind的对象映射器具有属性MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES,我相信这是同一字段运行jackson的原因。 我找不到与GSON类似的房产。 有关如何解决此问题的任何指示都将非常有帮助。

使用的技术: 弹簧靴 春季休息模板 com.google.code.gson:gson:2.8.6

1 个答案:

答案 0 :(得分:0)

尝试使用此@SerializedName替换@JsonProperty注释。

示例:

import com.google.gson.annotations.SerializedName;

public class Foo {    
   @SerializedName("USERId")
   private String uSERId;
}

编辑:

第二个选项是使用自定义JsonDeserializer。这是一个示例:

public class UserDeserializer implements JsonDeserializer<User> {

    @Override
    public User deserialize(JsonElement paramJsonElement, Type paramType,
            JsonDeserializationContext paramJsonDeserializationContext) throws JsonParseException {

    User user = new Gson().fromJson(paramJsonElement.getAsJsonObject(), User.class);

    try {
        String id = null;
        if (paramJsonElement.getAsJsonObject().get("USERId") != null) {
            id = paramJsonElement.getAsJsonObject().get("USERId").getAsString();
        }

        user.setuSERId(id);
    } catch (IllegalArgumentException e) {
        throw new RuntimeException(e);
    }

    return user;
}

然后像这样创建自己的Gson:

Gson customGson = new GsonBuilder()
                .registerTypeAdapter(User.class, new UserDeserializer())
                .create();

并将其设置在您的转换器上

messageConverter.setGson(customGson);