无法使用 Jackson 解析 JSON
Unable Parse a JSON using Jackson
我的代码中有一个 mongo 数据库调用。来自数据库的响应使用 codehaus jackson 进行映射。
Json:
[
{
"_id": "555",
"rates": 1,
"reviews": [
{
"author_name": "Instructor 9999",
"_authKey": "demo\556",
"text": "asdfa",
"date": 551,
"_id": "5454-4920",
"title": "asdf",
"comments": []
}
],
"votedUsers": [
{
"mng\39999": 4
}
],
"rating": 4
},
{
"_id": "45589",
"rates": 1,
"reviews": [
{
"author_name": "feef",
"_authKey": "ad\ads",
"text": "Working perfect",
"date": 1498659163,
"_id": "asdas-319",
"title": "test",
"comments": []
}
],
"votedUsers": [
{
"abc\bis@cdf.com": 4
}
],
"rating": 4
}
]
我创建了以下 DTO 结构:
@JsonIgnoreProperties(ignoreUnknown = true)
public class MaterialReviewsDTO implements Serializable {
private static final long serialVersionUID = 1L;
private String _id;
private int rates;
private List<ReviewsDTO> reviews;
private List<VotedUsersDTO> votedUsers;
//List<TypeReference<HashMap<String, String>>> votedUsers;
private int rating;.
//Getter Setter
}
@JsonIgnoreProperties(ignoreUnknown = true)
public class VotedUsersDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Map<String, String> votedUser;
//Getter Setter
}
下面是我触发查询的代码:
List<MaterialReviewsDTO> materialReviewsDTOs = DBConnectionRealmByDBName
.find(query,
MaterialReviewsDTO.class,
CollectionNameConstant.REVIEWS_COLLECTION);
问题是所有 JSON 都被映射到 DTO 中,除了以下部分:
"votedUsers" : [
{
"abc\bis@cdf.com" : 4
}
]
VotedUserDTO 在响应中为空。 VotedUsers 是包含键值对数据的对象列表。
我没有提到 ReviewsDTO,因为它已被完美映射。如何映射 votedUsers
部分?
注意:我正在使用Spring进行开发。
votedUsers 应该是一个 VotedUsersDTO 列表。
如果您查看 JSON:
中的 VotedUsersDTO
{
"abc\bis@cdf.com" : 4
}
这意味着有一个字段 abc\bis@cdf.com
您希望其值为 4。
这不符合 DTO 定义中的 id
或 votedUser
映射。
您JSON
的一些观察
1. Json设计时应考虑固定键和变量值。
2. 由于在上面的例子中,Key 和 values 都是可变的,我们可以使用 Map
所以最终的解决方案是
从 private List<VotedUsersDTO> votedUsers;
更改为 private List<Map<String, Integer>> votedUsers
private List<Map<String, String>> votedUsers;
不要使用明确的 votedUser DTO。
我的代码中有一个 mongo 数据库调用。来自数据库的响应使用 codehaus jackson 进行映射。
Json:
[
{
"_id": "555",
"rates": 1,
"reviews": [
{
"author_name": "Instructor 9999",
"_authKey": "demo\556",
"text": "asdfa",
"date": 551,
"_id": "5454-4920",
"title": "asdf",
"comments": []
}
],
"votedUsers": [
{
"mng\39999": 4
}
],
"rating": 4
},
{
"_id": "45589",
"rates": 1,
"reviews": [
{
"author_name": "feef",
"_authKey": "ad\ads",
"text": "Working perfect",
"date": 1498659163,
"_id": "asdas-319",
"title": "test",
"comments": []
}
],
"votedUsers": [
{
"abc\bis@cdf.com": 4
}
],
"rating": 4
}
]
我创建了以下 DTO 结构:
@JsonIgnoreProperties(ignoreUnknown = true)
public class MaterialReviewsDTO implements Serializable {
private static final long serialVersionUID = 1L;
private String _id;
private int rates;
private List<ReviewsDTO> reviews;
private List<VotedUsersDTO> votedUsers;
//List<TypeReference<HashMap<String, String>>> votedUsers;
private int rating;.
//Getter Setter
}
@JsonIgnoreProperties(ignoreUnknown = true)
public class VotedUsersDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Map<String, String> votedUser;
//Getter Setter
}
下面是我触发查询的代码:
List<MaterialReviewsDTO> materialReviewsDTOs = DBConnectionRealmByDBName
.find(query,
MaterialReviewsDTO.class,
CollectionNameConstant.REVIEWS_COLLECTION);
问题是所有 JSON 都被映射到 DTO 中,除了以下部分:
"votedUsers" : [
{
"abc\bis@cdf.com" : 4
}
]
VotedUserDTO 在响应中为空。 VotedUsers 是包含键值对数据的对象列表。
我没有提到 ReviewsDTO,因为它已被完美映射。如何映射 votedUsers
部分?
注意:我正在使用Spring进行开发。
votedUsers 应该是一个 VotedUsersDTO 列表。
如果您查看 JSON:
{
"abc\bis@cdf.com" : 4
}
这意味着有一个字段 abc\bis@cdf.com
您希望其值为 4。
这不符合 DTO 定义中的 id
或 votedUser
映射。
您JSON
的一些观察
1. Json设计时应考虑固定键和变量值。
2. 由于在上面的例子中,Key 和 values 都是可变的,我们可以使用 Map
所以最终的解决方案是
从 private List<VotedUsersDTO> votedUsers;
更改为 private List<Map<String, Integer>> votedUsers
private List<Map<String, String>> votedUsers;
不要使用明确的 votedUser DTO。