Jackson 相关的憨憨问题。
TL;DR
这是个很弱智的问题,而且弱智的我被这个问题困扰了一天:
如果你使用 Jackson 解析 json,那么要小心引号。使用 JsonNode.get().asText()
而不是 JsonNode.get().toString()
。
细节
前端传 json 大致如下:
{
"title": "二手 NS",
"description": "description",
"originPrice": 2600,
"salePrice": 1999,
"deliveryPrice": 0,
"userId": 30,
"category": "手机数码"
}
实体类 Category 属性简要如下:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
int id;
@Column(name = "name")
String name;
我的问题:后端要根据传来的 category 字段查询这个分类的信息,我的代码如下:
使用 jackson
解析 json:
JsonNode inputInfo = new ObjectMapper().readTree(inJson);
String categoryName = inputInfo.get("category").toString();
Category category = categoryService.getCategoryByName(categoryName);
CategoryService:
public Category getCategoryByName(String categoryName) {
// xxxx
return categoryDAO.findByName(categoryName);
}
dao 简单使用 JPA 查询查不到:
List<Category> findByName(String name);
手写 SQL 查询也查不到:
@Query(value = "select * from category_ c where c.name = ?1", nativeQuery = true)
Category findByName(String name);
然后我把 spring 配置改成显示 SQL 语句:
jpa:
show-sql: true
运行时执行的 SQL 语句如下:
Hibernate: select category0_.id as id1_0_, category0_.name as name2_0_ from category_ category0_ where category0_.name=?
正常且符合逻辑的查询,把这串 SQL 手动执行了下,能正常查出结果:
select category0_.id as id1_0_, category0_.name as name2_0_ from category_ category0_ where category0_.name='手机数码'
那么...是不是 getCategoryByName()
方法传入的字符串出了问题?在这个方法里打印一下日志看看:
2020-04-14 12:16:54.279 WARN 10996 --- [nio-8383-exec-1] x.b.c.service.CategoryService : "手机数码"
hmmm 这个分类名多了个双引号包裹,因为这个双引号造成了查不出结果...这就是 Jackson 使用相关的一些细节。
我原来从 json 取值的写法是:
String categoryName = inputInfo.get("category").toString();
那么这里的 categoryName
就是带双引号的,而想要预期效果,要使用 asText()
方法:
String categoryName = inputInfo.get("category").asText();