记一次 Jackson toStringasText() 相关问题

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();
加载评论