Java中如何让toString方法自动返回带单引号的JSON格式字符串
实现方案(无需手动维护toString逻辑,新增字段自动适配)
以下三种方案都可以满足需求,新增成员变量时完全不需要修改toString代码:
方案1:JSON序列化库实现(最稳定,格式兼容性好)
直接用Gson/Jackson等JSON序列化工具自动扫描类的所有字段生成JSON,再替换引号格式即可,示例用Gson演示:
import com.google.gson.Gson; import com.google.gson.GsonBuilder; class MyClass { int myVariable; // 后续新增任意成员变量都无需修改toString逻辑 private static final Gson gson = new GsonBuilder().create(); @Override public String toString() { // 先序列化得到标准双引号JSON,再替换为单引号,外层包裹类名 String fieldJson = gson.toJson(this); return "'" + getClass().getSimpleName() + "':" + fieldJson.replace("\"", "'"); } }
如果不需要输出某个字段,给字段加transient关键字修饰即可,序列化工具会默认跳过该字段
方案2:Apache Commons Lang工具类实现
如果不想引入JSON序列化库,可以用ToStringBuilder的反射能力自动生成JSON格式字符串:
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; class MyClass { int myVariable; @Override public String toString() { String fieldJson = ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); return "'" + getClass().getSimpleName() + "':" + fieldJson.replace("\"", "'"); } }
方案3:Lombok注解实现(开发效率最高)
如果项目允许使用Lombok,配合序列化工具几行代码就能搞定:
import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; // @Data注解会自动生成Getter/Setter等基础方法 @Data class MyClass { int myVariable; private static final ObjectMapper objectMapper = new ObjectMapper(); @Override public String toString() { try { return "'MyClass':" + objectMapper.writeValueAsString(this).replace("\"", "'"); } catch (Exception e) { return super.toString(); } } }
补充说明:你当前示例中的代码存在两处语法错误,
@Overide应改为@Override,返回值类型string应改为大写开头的String,且拼接的JSON格式不合法,上述方案会自动生成规范的键值对格式。
内容的提问来源于stack exchange,提问作者Shashi Tunga
相关产品推荐
相关产品推荐

