在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
的所有键和值。