在java中将json对象转换为tsv格式

在java中将json对象转换为tsv格式,java,json,csv,object,hashmap,Java,Json,Csv,Object,Hashmap,我有以下课程 public class Params { private String dataType; private Map<String, List<String>> group; private List<Aggregate> aggregates; private List<String> scene; private List<String> company; private

我有以下课程

public class Params {
    private String dataType;
    private Map<String, List<String>> group;
    private List<Aggregate> aggregates;
    private List<String> scene;
    private List<String> company;
    private List<Map<String, List<String>>> fit;
    private Map<String, String> params;
    private String tempo;
    private String id;
    private String valuation;
}
所以我得到这样的输出:

  {
      "dataType" : "abc",
      "group" : { },
      "aggregates" : [ ],
      "scene" : [ "AC" ],
      "company" : [ "pr" ],
      "fit" : [ {
        "prod" : [ "A1" ]
      } ],
      "params" : null,
      "tempo" : "note",
      "id" : "123",
      "valuation" : USD
    }
我的最终输出是这样的(制表符分隔):

abc AC pr产品A1票据123美元

我尝试使用:

parameter.getGroup.values()
但是,这只提供了以[val]格式显示的值

如何同时获取对象的所有值?是否可以在不进行单独处理的情况下同时从地图、列表等中获取值


如果您有任何帮助,我们将不胜感激。

您的问题并不清楚,在生成特定场景的选项卡式输出时,您希望如何处理数据,但我将尝试提供一些示例代码来帮助您

然而,首先,我想说的是,将JSON序列化为JSON,然后将JSON序列化为制表符分隔的值不是一个好主意。当你可以做一个步骤时,你要做两个步骤,JSON序列化并不能让你更接近你的目标,而且序列化通常是一个代价高昂的过程——你不想做得太多

因此,考虑到这一点,这里有一个快速示例,说明如何实现简单的以制表符分隔的序列化:

由于您的
Params
类(参考
Aggregate
对象的
List
)中至少有一个自定义对象要处理,因此我建议创建一个接口,您的类可以实现该接口,以指示它们能够序列化为制表符分隔的字符串

我只是将此接口称为
TabSerializable

public interface TabSerializable {
    public String toTabbedString();
}
接下来,我修改了
Params
类以实现此接口:

public class Params implements TabSerializable{
    //fields omitted for brevity.
    ...

    public String toTabbedString(){
        StringJoiner joiner = new StringJoiner("\t");

        TabSerializer.addValue(dataType, joiner);
        TabSerializer.addValue(group, joiner);
        TabSerializer.addValue(aggregates, joiner);
        TabSerializer.addValue(scene, joiner);
        TabSerializer.addValue(company, joiner);
        TabSerializer.addValue(fit, joiner);
        TabSerializer.addValue(params, joiner);
        TabSerializer.addValue(tempo, joiner);
        TabSerializer.addValue(id, joiner);
        TabSerializer.addValue(valuation, joiner);

        return joiner.toString();
    }
    ...
}
public class Aggregate implements TabSerializable{
    private String data;

    @Override
    public String toTabbedString() {
        return data;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}
我还创建了一个示例
Aggregate
类,它也实现了这个接口:

public class Params implements TabSerializable{
    //fields omitted for brevity.
    ...

    public String toTabbedString(){
        StringJoiner joiner = new StringJoiner("\t");

        TabSerializer.addValue(dataType, joiner);
        TabSerializer.addValue(group, joiner);
        TabSerializer.addValue(aggregates, joiner);
        TabSerializer.addValue(scene, joiner);
        TabSerializer.addValue(company, joiner);
        TabSerializer.addValue(fit, joiner);
        TabSerializer.addValue(params, joiner);
        TabSerializer.addValue(tempo, joiner);
        TabSerializer.addValue(id, joiner);
        TabSerializer.addValue(valuation, joiner);

        return joiner.toString();
    }
    ...
}
public class Aggregate implements TabSerializable{
    private String data;

    @Override
    public String toTabbedString() {
        return data;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}
由于大多数数据结构都是通用类型的,如映射和列表,因此我创建了
TabSerializer
类来帮助将这些结构转换为制表符分隔的字符串:

import java.util.List;
import java.util.Map;
import java.util.StringJoiner;

public class TabSerializer {
    private static void addValuesFromMap(Map<?,?> obj, StringJoiner joiner) {
        for(Object key: obj.keySet()){
            Object value = obj.get(key);
            if(value == null){
                continue;
            }
            addValue(key, joiner);
            addValue(value, joiner);
        }
    }

    private static void addValuesFromList(List<?> arr, StringJoiner joiner) {
        for(int i=0; i<arr.size(); i++){
            Object value = arr.get(i);
            addValue(value, joiner);            
        }
    }

    public static void addValue(Object value, StringJoiner joiner){
        if(value == null){
            return;
        }
        if(value instanceof List){
            addValuesFromList((List<?>)value, joiner);
        }else if(value instanceof Map){
            addValuesFromMap((Map<?,?>)value, joiner);
        }else if(value instanceof TabSerializable){
            joiner.add(((TabSerializable) value).toTabbedString());
        }else{
            joiner.add(String.valueOf(value));

        }
    }
}
输出为:

abc AC pr产品A1票据123美元


我希望这能帮助你开始。享受吧

我有:私人列表时间范围;它有开始日期、结束日期和名称。示例:“时间范围”:[{“名称”:“2014”,“起始日期”:“2014-01-01”,“结束日期”:“2014-12-31”}],如何打印这些值(2014,2014-01-01,2014-12-31)选项卡,使用上述代码分隔?我有一个名为“NamedTimeRange.java”的类。遵循
Params
类中的示例-通过创建方法
toTabbedString
实现
TabSerializable
接口,使用
TabSerializer
处理泛型字段。有比在Params类中多次调用“addValue”函数更好的方法吗?该代码是否可以更高效?
Params
是一个具有许多字段的自定义对象,调用
addValue
可以将这些字段添加到序列化的
字符串中。我想您可以使用反射来迭代所有字段,但通常情况下,反射成本很高,应该尽可能避免。如果您可以避免使用自定义类,而是使用像
Map
这样的泛型结构,那么您可以轻松地迭代该
Map
的所有键和值。