【问题标题】:How to marshall and un marshall HashMap<String, ArrayList<String>>如何编组和取消编组 HashMap<String, ArrayList<String>>
【发布时间】:2012-09-24 09:35:00
【问题描述】:

我有一个具有 HashMap (String, ArrayList(String) ) 的 javabean 哈希映射属性。 我已经生成了一个 jax ws 客户端。但是我无法从 hashMap 访问 ArrayList,因为它已转换为一些默认类型的 arraylist。我该如何解决这个问题?

【问题讨论】:

  • 我不明白。您的 HashMap 对键和值有何要求?你已经尝试了什么?请编辑您的问题并输入一些代码。干杯
  • 请看标题...它是 HashMap >...
  • 我不知道为什么它没有显示在描述中......

标签: xml binding jaxb jax-ws marshalling


【解决方案1】:

使用附加类Pair

@XmlAccessorType(XmlAccessType.FIELD)
public class Pair
{
   private String key;

   private String[] value;

   public Pair()
   {
   }

   public Pair(String key, String[] value)
   {
      this.key = key;
      this.value = value;
   }
}  

XmlJavaAdaptor

public class PairAdaptor extends XmlAdapter<Pair[], HashMap<String, ArrayList<String>>>
{
   @Override
   public HashMap<String, ArrayList<String>> unmarshal(Pair[] v) throws Exception
   {
      final HashMap<String, ArrayList<String>> retVal = new HashMap<String, ArrayList<String>>();
      for (Pair pair : v)
      {
         retVal.put(pair.key, new ArrayList<String>(Arrays.asList(pair.value)));
      }

      return retVal;
   }

   @Override
   public Pair[] marshal(HashMap<String, ArrayList<String>> v) throws Exception
   {
      final Pair[] retVal = new Pair[v.size()];
      int counter = 0;
      for (String key : v.keySet())
      {
         retVal[counter] = new Pair(key, v.get(key).toArray(new String[]{}));
         counter++;
      }

      return retVal;
   }
}

用法

@XmlJavaTypeAdapter(PairAdaptor.class)
private HashMap<String, ArrayList<String>> value;  

更新。泛型而不是字符串

@XmlAccessorType(XmlAccessType.FIELD)
public class Pair<T>
{
   private String key;

   private T[] value;

   public Pair()
   {
   }

   public Pair(String key, T[] value)
   {
      this.key = key;
      this.value = value;
   }

   public String getKey()
   {
      return key;
   }

   public T[] getValue()
   {
      return value;
   }
}  

通用适配器

public class GenericAdaptor<T> extends XmlAdapter<Pair[], HashMap<String, ArrayList<T>>>
{
   @Override
   public HashMap<String, ArrayList<T>> unmarshal(Pair[] v) throws Exception
   {
      final HashMap<String, ArrayList<T>> retVal = new HashMap<String, ArrayList<T>>();
      for (Pair<T> pair : v)
      {
         retVal.put(pair.getKey(), new ArrayList<T>(Arrays.asList(pair.getValue())));
      }

      return retVal;
   }

   @Override
   public Pair[] marshal(HashMap<String, ArrayList<T>> v) throws Exception
   {
      final Pair[] retVal = new Pair[v.size()];
      int counter = 0;
      for (String key : v.keySet())
      {
         retVal[counter] = new Pair(key, v.get(key).toArray());
         counter++;
      }

      return retVal;
   }
}  

对于每种类型,您都应该有自己的适配器。
对于字符串

public class StringAdaptor extends GenericAdaptor<String>
{
}  

对于猫

public class CatAdaptor extends GenericAdaptor<Cat>
{
}

用法

   @XmlJavaTypeAdapter(StringAdaptor.class)
   private HashMap<String, ArrayList<String>> value;   

   @XmlJavaTypeAdapter(CatAdaptor.class)
   private HashMap<String, ArrayList<Cat>> cats;

【讨论】:

  • @llya 你的意思是我必须将我的地图值更改为字符串数组
  • @user1397770 你不仅可以使用String。您可以使用任何对象代替字符串。 HashMap&lt;String, ArrayList&lt;Object&gt;&gt;。在这种情况下,类Pair 具有字段String keyObject[] value。而PairAdaptor 应该会有一些变化。
  • thanx @llya ...你有任何 HashMap 通用适配器的例子
  • 我遇到了另一个问题......在客户端我得到了 Pair 数组。我必须通过执行一些操作从中检索数据。我怎样才能在客户端获得准确的地图。我不想将对数组转换为我的地图..请建议
  • 这是客户端代码:- InstantPrint service = new InstantPrint(); IInstantPrint portType = service.getInstantPrintServicePort(); StartGameBean startGameBean = new StartGameBean(); startGameBean =portType.onStartGameData(); MapBeanElementsArray map=startGameBean.getGameMap();我的 StartGameBean 有 @XmlJavaTypeAdapter(MapBeanValueAdapter.class) private HashMap gameMap;在 MapBeanValueAdapter 中,我正在编组未编组地图,就像你告诉我不想要 MapBeanElementsArray 一样。我想要来自 startGameBean.getGameMap() 的 HashMap
猜你喜欢
  • 2021-12-12
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2013-10-05
  • 2014-01-02
  • 2013-07-29
相关资源
最近更新 更多