GVA*_*Art 1 java spring pojo resttemplate
在开发Spring REST Client时出现问题:
{
"return": [
{
"admin": false,
"alias": "",
"email": "",
"emailId": {"value": 0},
"groups": [],
"id": {"value": 1},
"locked": false,
"loggedInCount": 0,
"master": true,
"sms": "",
"smsId": {"value": 0},
"type": "POWER",
"username": "NGCP"
},
{
"admin": false,
"alias": "",
"email": "",
"emailId": {"value": 0},
"groups": [{"value": 2}],
"id": {"value": 3},
"locked": false,
"loggedInCount": 0,
"master": false,
"sms": "",
"smsId": {"value": 0},
"type": "POWER",
"username": "POLICY"
}
]
}
Run Code Online (Sandbox Code Playgroud)
用于保存用户的模型类:
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
public User(){
}
private boolean admin;
private String alias;
private String email;
private String emailId;
private ArrayList<String> groups;
private String id;
private boolean locked;
private int loggedInCount;
private boolean master;
private String sms;
private String smsId;
private String type;
private String userName;
//getter and setters
}
Run Code Online (Sandbox Code Playgroud)
现在我正在使用"RestTemplate"来获得结果.
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<User[]> response = restTemplate.exchange(URL_GET,HttpMethod.GET,request, User[].class);
Run Code Online (Sandbox Code Playgroud)
并得到错误.我知道这是因为主键是"结果"但是我可以指定restTemplate应该从哪里解析这个JSON吗?
并且可以在文件上指出liks"emailId"以获得直接价值?一些模板?
截至"主要关键是结果":
一个.如果您只处理这种Web服务之一,我会为实际有效负载创建一个包装类:
public class Return{
// Class property cannot be called "return" because it is Java reserved name.
@JsonProperty("return")
private User[] array;
.... getter and setter
}
Run Code Online (Sandbox Code Playgroud)
湾 如果你处理实际有效负载处于"返回"字段的多个web服务,我将创建一个通用的包装类:
public class Return<T>{
// Class property cannot be called "return" because it is Java reserved name.
@JsonProperty("return")
private T[] array;
.... getter and setter
}
Run Code Online (Sandbox Code Playgroud)
致电RestRemplate:
ResponseEntity<Return<User>> response = restTemplate.exchange(URL_GET,
HttpMethod.GET, request, new ParameterizedTypeReference<Return<User>>(){});
User[] usersArray = response2.getBody().getArray();
Run Code Online (Sandbox Code Playgroud)从JSON属性中称为"value"的属性值开始,我将创建两个自定义JsonDeserializer:一个用于单值,一个用于值数组,并使用@JsonDeserialize适用的位置注释每个属性:
单值解串器:
public class StringValueDeserializer extends JsonDeserializer<String>{
@Override
public String deserialize(JsonParser parser, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
ObjectCodec codec = parser.getCodec();
TreeNode node = codec.readTree(parser);
JsonNode value = (JsonNode)node.get("value");
if (value != null){
return value.asText();
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
值派生程序数组:
public class StringArrayValueDeserializer extends JsonDeserializer<List<String>>{
@Override
public List<String> deserialize(JsonParser parser, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
List<String> ret = new ArrayList<>();
ObjectCodec codec = parser.getCodec();
TreeNode node = codec.readTree(parser);
if (node.isArray()){
for (JsonNode n : (ArrayNode)node){
JsonNode value = n.get("value");
if (value != null){
ret.add(value.asText());
}
}
}
return ret;
}
}
Run Code Online (Sandbox Code Playgroud)
在这里你是新的User.class:
public class User {
private boolean admin;
private String alias;
private String email;
@JsonDeserialize(using = StringValueDeserializer.class)
private String emailId;
@JsonDeserialize(using = StringArrayValueDeserializer.class)
private ArrayList<String> groups;
@JsonDeserialize(using = StringValueDeserializer.class)
private String id;
private boolean locked;
private int loggedInCount;
private boolean master;
private String sms;
@JsonDeserialize(using = StringValueDeserializer.class)
private String smsId;
private String type;
private String username;
.... getter and setter
}
Run Code Online (Sandbox Code Playgroud)祝好运!
| 归档时间: |
|
| 查看次数: |
9811 次 |
| 最近记录: |