如果输出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 中具有错误值的键
Pandas DataFrame to_json() 生成带点符号的索引