Eclipse提供了为每个类自动生成toString方法的选项。
进一步利用这个功能,我正在创建字符串格式模板,在eclipse生成toString方法时作为Json格式提供。
我使用了以下字符串格式模板:
{ ${member.name()}:"${member.value}", ${otherMembers}}
现在我按照POJO生成toString方法,但是当我运行这个程序时,我得到的结果是而不是有效的JSON。
{ name:"null", reportees:"[1, 2, 3]", department:"[retail, banking, finance]", owns:"null", supplimentary:"null}
密码
public class TestPojo {
private String name;
private List<String> reportees;
private String[] department;
private Machine owns;
private List<Machine> supplimentary;
public static void main(String arg[]) {
TestPojo aTestPojo = new TestPojo();
aTestPojo.department = new String[] { "retail", "banking", "finance" };
aTestPojo.reportees = new ArrayList<String>() {
{
add("1");
add("2");
add("3");
}
};
System.out.print(aTestPojo);
}
public static class Machine {
private String machineName;
private String duties;
public String getMachineName() {
return machineName;
}
public void setMachineName(String machineName) {
this.machineName = machineName;
}
public String getDuties() {
return duties;
}
public void setDuties(String duties) {
this.duties = duties;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("{ machineName:\"").append(machineName).append("\", duties:\"").append(duties).append("}");
return builder.toString();
}
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("{ name:\"").append(name).append("\", reportees:\"").append(reportees).append("\", department:\"").append(Arrays.toString(department)).append("\", owns:\"").append(owns).append("\", supplimentary:\"").append(supplimentary).append("}");
return builder.toString();
}
}
仅推荐用于字符串值。下面的表达式为您提供了JSON toString生成。
{"${member.name()}":"${member.value}", "${otherMembers}"}
它不是有效的JSON,因为数组和集合的打印方式(“[1,2,3]”而不是[1,2,3])。
此外,它不会通过严格的JSON验证,因为字段名也应该被引用。
Eclipse的字符串格式模板可能非常有用,但为了实现完全控制,最好创建一个生成器类。
这里有一个这样做的要点。您可以对其进行扩展,它适用于您的示例类。
您可以使用此类在Eclipse中生成toString()方法。
借助@dvlcube idea。我构建了一个“Eclipse Custom toString()builder”来生成toString方法代码,以返回当前对象的JSON格式字符串。
按照此解决方案的github单击[EclipsetoString_BuilderJSON](https://github.com/djaganathan/EclipseToStringBuilderForJson/blob/master/src/main/java/com/github/djaganathan/opensource/eclipse/util/JsonToStringBuilder.java,自定义Eclipse toString()Builder)
样本测试代码
import com.google.common.collect.Maps;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.time.StopWatch;
import org.elasticsearch.common.collect.Lists;
public class TestPojo {
private String name;
private List<String> reportees;
private String[] department;
private Machine owns;
private List<Machine> supplimentary;
private int i = 10;
private Map<String, Machine> machineList = Maps.newConcurrentMap();
public static void main(String arg[]) {
TestPojo aTestPojo = new TestPojo();
aTestPojo.department = new String[] { "retail", "banking", "finance"};
aTestPojo.reportees = new ArrayList<String>() {
{
add("1");
add("2");
add("3");
}
};
Machine aMachine = new Machine("Train", "travel");
Machine aMachine1 = new Machine("Lorry", "Carrier");
aTestPojo.supplimentary = Lists.newArrayList(aMachine, aMachine1);
aTestPojo.machineList.put("Train", aMachine);
aTestPojo.machineList.put("Lorry", aMachine1);
System.out.print(aTestPojo);
}
public static class Machine {
private String machineName;
private String duties;
public Machine(String machineName, String duties) {
super();
this.machineName = machineName;
this.duties = duties;
}
public String getMachineName() {
return machineName;
}
public void setMachineName(String machineName) {
this.machineName = machineName;
}
public String getDuties() {
return duties;
}
public void setDuties(String duties) {
this.duties = duties;
}
@Override
public String toString() {
JsonToStringBuilder builder = new JsonToStringBuilder(this);
builder.append("machineName", machineName);
builder.append("duties", duties);
return builder.build();
}
}
@Override
public String toString() {
JsonToStringBuilder builder = new JsonToStringBuilder(this);
builder.append("name", name);
builder.append("reportees", reportees);
builder.append("department", department);
builder.append("owns", owns);
builder.append("supplimentary", supplimentary);
builder.append("i", i);
builder.append("machineList", machineList);
String value = builder.build();
return value;
}
}
运行此程序时,我得到了以下JSON输出
{"name": null,"reportees": ["1","2","3"],"department": ["retail","banking","finance"],"owns": null,"supplimentary": [{"machineName": "Train","duties": "travel"},{"machineName": "Lorry","duties": "Carrier"}],"i": 10,"machineList": {"Lorry": {"machineName": "Lorry","duties": "Carrier"},"Train": {"machineName": "Train","duties": "travel"}}}
我有一个有趣的问题要解决。 让我们考虑以下类别(人员和电话): 人 电话 假设我有一个由lombok注释@ToString生成的Person对象字符串: 如何将上面的字符串再次转换为对象?是否有任何库可以帮助我完成这个过程,或者我必须手动为其创建解析器? 我知道还有其他方法,比如生成json或序列化为java对象,然后将其转换回来。然而,现在这不是我的解决方案,因为我必须使用上面提到的字符串。
问题内容: 是否有任何使用Spring或java替换模板字符串以及值的API。 例如: 其中参数(,)中的形式。 问题答案: 我最喜欢的模板引擎是Apache Velocity 也可以与Spring很好地集成,此处有介绍性文章
给定类 我试图定义一个自定义的代码生成模板,该模板将创建一个方法,其形式如下 我有以下速度模板,但输出不正确。 输出为 当我试图向字符串添加一个结束大括号(})时,模板-它无法呈现。
如果我们有如下类: 并且要在或中使用它,则需要实现和 为该类自动生成的是: 但我想知道我们是否应该这样做: 这比自动生成的方法更好还是更差?类似的方法也在其他脚本语言中使用,正如我所见,我想知道生成的散列是更好还是更差(或者没有区别)。 注意:假设字符串concat可以被缓存并因此得到优化,我们将其忽略为性能下降
问题内容: 我有使用的Iterator的现有代码 带有编译警告 parameterized 我可以更新为通用版本: 但是,是不是有办法“泛型化” 带钥匙? 我找到了这个答案,但是它的建议没有编译 编辑 使用我收到类型安全警告: to conform to Iterator 同样使用Eclipse Infer泛型也不会执行任何代码更改 问题答案: 您提供的链接答案所使用的类别与您使用的类别不同。如果
问题内容: 对于一些简单的类,自动生成方法的好还是坏做法? 我正在考虑生成类似于以下内容的内容,该内容采用变量名并生成一种方法,该方法先显示名称,然后显示其值。 问题答案: Eclipse 3.5.2(可能还有更早的版本)已经提供了此功能。如果在编辑器中单击鼠标右键,则会在“源”->“生成toString()…”下找到它。 要回答有关自动生成是否不好的做法的问题,我认为不是。如果生成的代码与您自己