如果输出json具有带点(。)字符的键,如何在spring中为rest api创建域类

Posted

技术标签:

【中文标题】如果输出json具有带点(。)字符的键,如何在spring中为rest api创建域类【英文标题】:How to create domain class for rest api in spring if output json has a key with dot(.) character 【发布时间】:2018-02-22 02:40:51 【问题描述】:

我在 Spring Boot 中使用了一个 rest API,但我收到了这个错误 -

   java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy

经过严格调试,我发现这是因为我的域类没有我在 API 响应中获得的密钥 “developer.email”

我在域类中有@JsonIgnoreProperties(ignoreUnknown = true) 注释。 Java 不允许您使用“developer.email”创建变量名

如何让它发挥作用? Spring框架中是否有针对这种情况的解决方法? 有没有办法手动配置这个实体而不是spring autoconfigure。

这是我要解析的 JSON

 "developer.email" : "dev.accounts+developerapps@domain.com"

这是我当前的域类,我在这里使用 lombok。

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class OauthTokenResponse 
    private String refresh_token_expires_in;
    private String refresh_token_status;
    private String api_product_list;
    private String app_enduser;
    @JsonIgnore
    private List<String> api_product_list_json;
    private String organization_name;

    @JsonIgnore
    @JsonProperty("developer.email")
    private String developerEmail;

    private String token_type;
    private String issued_at;
    private String client_id;
    private String access_token;
    private String refresh_token;
    private String application_name;
    private String scope;
    private String refresh_token_issued_at;
    private String expires_in;
    private String refresh_count;
    private String status;

【问题讨论】:

请在您使用注释的地方显示您的域类。 @RahulGupta 我已经更新了我的问题中的域类 我更新了我的答案。请看一下。 【参考方案1】:

您是否尝试使用“@JsonProperty”注释该字段?

@JsonProperty("developer.email")
String developerEmail

小测试来证明我的观点:

public class Evil 
  @JsonProperty("evil.property")
  public int evil;


@RunWith(MockitoJUnitRunner.class)
public class MapperTest 
  @Test
  public void mapperTest() throws JsonParseException, JsonMappingException, IOException 
    final ObjectMapper mapper = new ObjectMapper();
    final String test = " \"evil.property\" : 2 ";
    final Evil evil = mapper.readValue(test, Evil.class);
    assertThat(evil.evil, is(2));
  

【讨论】:

仍然遇到同样的异常。有没有办法忽略这个键? 从属性中删除@JsonIgnore - 不要忽略并立即映射它:) 我写了一个小单元测试,它与“evil.properties.with.dots”配合得很好 我下次试试这个【参考方案2】:

有没有办法忽略这个键?

你可以使用@JsonIgnoreProperties(value = "developer.email")注解忽略这个属性。

【讨论】:

已经在使用这个了,但是还有别的问题。我想我走错路了 并且还在 developerEmail 属性的 getter 中使用 @JsonIgnore。检查并请让我知道它是否正常工作。 感谢您的努力,但这不起作用我找到了解决方法。 在字符串中获取响应,然后将其解析为 MongoDB 文档

以上是关于如果输出json具有带点(。)字符的键,如何在spring中为rest api创建域类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 5 或打字稿中检索下面提到的 json 中具有错误值的键

KVC - 带点分隔的键值编码 - 不符合 KVC 的异常

Pandas DataFrame to_json() 生成带点符号的索引

ValueError:列的长度必须与具有多个输出的键的长度相同

如何将 JSON_INSERT 与字符串中的键一起使用?

如何将JSON字符串格式化输出