Java 如何映射列表<;MyObject>;列出<;HashMap<;字符串,对象>&燃气轮机;用推土机?
假设我有一个对象Foo,其中包含对对象栏的引用列表:Java 如何映射列表<;MyObject>;列出<;HashMap<;字符串,对象>&燃气轮机;用推土机?,java,serialization,mapping,dozer,Java,Serialization,Mapping,Dozer,假设我有一个对象Foo,其中包含对对象栏的引用列表: public class Foo{ String fooStr; List<Bar> barList; //get/set barList/someStr go here } public class Bar { String barStr; } 但我想知道如何通过对Bar的引用列表来表示对HashMap的转换,从而得到以下结果: { "fooStr" : "value of fooS
public class Foo{
String fooStr;
List<Bar> barList;
//get/set barList/someStr go here
}
public class Bar {
String barStr;
}
但我想知道如何通过对Bar的引用列表来表示对HashMap的转换,从而得到以下结果:
{
"fooStr" : "value of fooStr",
"barList" : [{ "barStr" : "bar1" }, { "barStr" : "bar2" }, ...]
}
首选不使用自定义映射器的答案,但我知道这是否是实现此行为的唯一方法。您应该能够在自定义转换器中执行此操作:
public class Foo {
String fooStr;
List<Bar> barList;
...
}
public class Bar {
String barStr;
}
public class Target {
String fooStr;
Map<String, Bar> barMap;
}
public class TestCustomConverter implements CustomConverter {
public Object convert(Object destination, Object source, Class destClass, Class sourceClass) {
if (source == null) {
return null;
}
if (source instanceof Foo) {
Map<Bar> dest = null;
// check to see if the object already exists
if (destination == null) {
dest = new Target();
} else {
dest = (Target) destination;
}
((Target) dest).setFooStr(source.getFooStr());
for(Bar : source.getBarList()) {
((Target) dest).getBarMap().put(bar.getBarStr(), bar);
}
return dest;
} else if (source instanceof Target) {
Foo dest = null;
// check to see if the object already exists
if (destination == null) {
dest = new Foo ();
} else {
dest = (Foo) destination;
}
dest.getFoos().addAll(((Target)source).getBarMap().values());
dest.setFooStr(((Target)source).getFooStr()):
return dest;
} else {
throw new MappingException("Converter TestCustomConverter used incorrectly. Arguments passed in were:"
+ destination + " and " + source);
}
}
公共类Foo{
字符串fooStr;
列表栏列表;
...
}
公共类酒吧{
弦杆;
}
公共类目标{
字符串fooStr;
地图条形图;
}
公共类TestCustomConverter实现CustomConverter{
公共对象转换(对象目标、对象源、类destClass、类sourceClass){
if(source==null){
返回null;
}
if(Foo的源实例){
Map dest=null;
//检查对象是否已存在
如果(目标==null){
dest=新目标();
}否则{
目的地=(目标)目的地;
}
((Target)dest.setFooStr(source.getFooStr());
对于(Bar:source.getBarList()){
((目标)dest.getBarMap().put(bar.getBarStr(),bar);
}
返回目的地;
}else if(目标的源实例){
Foo dest=null;
//检查对象是否已存在
如果(目标==null){
dest=newfoo();
}否则{
目的地=(Foo)目的地;
}
dest.getFoos().addAll(((目标)源).getBarMap().values());
dest.setFooStr(((目标)源).getFooStr()):
返回目的地;
}否则{
抛出新的MappingException(“转换器TestCustomConverter使用不正确。传入的参数为:”
+目的地+”和“+来源);
}
}
警告:代码可能包含bug,但应该会让您有所了解。我对dozer不熟悉,但如果我使用自定义映射器进行此操作,我几乎肯定会按两个步骤进行:将“带多条的Foo”转换为“带列表的Foo”,然后转换为HashMap。您能用dozer完成吗?@Mark-我从“带列表的Foo”开始在这个例子中,我已经可以转换“单条Foo”对于嵌套HashMap——我只是在寻找一个类似级别的嵌套,但这些嵌套映射的列表与单个映射相结合。@Ben,对不起,我似乎看错了问题。别担心,Mark-我可能写得更好。-@Ben Burns这是一个非常令人困惑的问题,请更新回答:1,条形图如何映射到键,值对2,someStr是如何映射的3,在生成的json中,someStr和它的值之间有一个映射,但有一个列,这不是映射。。。
{
"fooStr" : "value of fooStr",
"barList" : [{ "barStr" : "bar1" }, { "barStr" : "bar2" }, ...]
}
public class Foo {
String fooStr;
List<Bar> barList;
...
}
public class Bar {
String barStr;
}
public class Target {
String fooStr;
Map<String, Bar> barMap;
}
public class TestCustomConverter implements CustomConverter {
public Object convert(Object destination, Object source, Class destClass, Class sourceClass) {
if (source == null) {
return null;
}
if (source instanceof Foo) {
Map<Bar> dest = null;
// check to see if the object already exists
if (destination == null) {
dest = new Target();
} else {
dest = (Target) destination;
}
((Target) dest).setFooStr(source.getFooStr());
for(Bar : source.getBarList()) {
((Target) dest).getBarMap().put(bar.getBarStr(), bar);
}
return dest;
} else if (source instanceof Target) {
Foo dest = null;
// check to see if the object already exists
if (destination == null) {
dest = new Foo ();
} else {
dest = (Foo) destination;
}
dest.getFoos().addAll(((Target)source).getBarMap().values());
dest.setFooStr(((Target)source).getFooStr()):
return dest;
} else {
throw new MappingException("Converter TestCustomConverter used incorrectly. Arguments passed in were:"
+ destination + " and " + source);
}
}