如何去除保存/打印JSON时出现的MyObjectSchema前缀?
嗨,这个问题我之前也碰到过!你看到的MyObjectSchema [latitude=45.95472, longitude=13.664836, ...]格式,其实是Java对象默认(或Lombok自动生成)的toString()方法输出结果。而你访问/someData路由能拿到正确JSON,是因为Spring框架用了Jackson这类序列化工具帮你把对象转换成了标准JSON格式,和直接调用toString()完全是两回事。
要去掉这个类名前缀,有两种实用的解决办法:
方法一:重写MyObjectSchema的toString()方法
直接在你的实体类里自定义toString的输出逻辑,让它返回JSON格式的字符串。推荐用Jackson的ObjectMapper来实现,避免手动拼接JSON容易出错的问题:
import com.fasterxml.jackson.databind.ObjectMapper; public class MyObjectSchema { // 你的实体字段:latitude、longitude、timezone、currently等 @Override public String toString() { try { // 用ObjectMapper把当前对象序列化为JSON字符串 return new ObjectMapper().writeValueAsString(this); } catch (Exception e) { // 序列化失败时, fallback到默认toString输出 return super.toString(); } } }
这样不管是在Eclipse里打印对象,还是把对象写入文件,都会输出标准的JSON格式,再也看不到类名前缀了。
方法二:在打印/保存时手动序列化对象
如果你不想修改实体类的代码,也可以在需要输出的地方,用Spring容器中的ObjectMapper(或者自己实例化)把对象转换成JSON字符串后再操作:
import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class YourSchedulerComponent { @Autowired private ObjectMapper objectMapper; // Spring默认会自动配置这个Bean @Scheduled(fixedDelayString = "${fixedDelaySchema}", initialDelayString = "${initialDelaySchema}") public MyObjectSchema createSchema() { MyObjectSchema schema = new MyObjectSchema(); // 填充schema的业务数据... // 转换为JSON字符串并打印 try { String jsonOutput = objectMapper.writeValueAsString(schema); System.out.println(jsonOutput); // 如果要保存到文件,直接把jsonOutput写入文件即可 // Files.write(Paths.get("output.json"), jsonOutput.getBytes()); } catch (Exception e) { e.printStackTrace(); } return schema; } }
补充说明
你看到的类名前缀,本质是因为你直接调用了对象的toString()方法——如果没有手动重写这个方法,Java会使用Object类的默认实现(格式为类名@哈希值);如果用了Lombok的@Data、@ToString注解,默认生成的toString会是类名 [字段1=值1, 字段2=值2...]的格式,也就是你现在看到的样子。而接口返回JSON是Spring用序列化框架处理的,和toString完全无关,所以才会出现两种不同的输出结果。
内容的提问来源于stack exchange,提问作者xmlParser

