当前位置: 首页 > 知识库问答 >
问题:

如何创建字符串格式模板来为Eclipse自动生成的toString生成Json

曾瀚昂
2023-03-14

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();
}

}

共有3个答案

房学文
2023-03-14

仅推荐用于字符串值。下面的表达式为您提供了JSON toString生成。

{"${member.name()}":"${member.value}", "${otherMembers}"}
漆雕誉
2023-03-14

它不是有效的JSON,因为数组和集合的打印方式(“[1,2,3]”而不是[1,2,3])。

此外,它不会通过严格的JSON验证,因为字段名也应该被引用。

Eclipse的字符串格式模板可能非常有用,但为了实现完全控制,最好创建一个生成器类。

这里有一个这样做的要点。您可以对其进行扩展,它适用于您的示例类。

您可以使用此类在Eclipse中生成toString()方法。

郭云
2023-03-14

借助@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()…”下找到它。 要回答有关自动生成是否不好的做法的问题,我认为不是。如果生成的代码与您自己