Java 如何映射列表<;MyObject>;列出<;HashMap<;字符串,对象>&燃气轮机;用推土机?

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

假设我有一个对象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 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);
    }
  }