Jaxb Marshall / Unmarshall плоская карта списков от JSON - PullRequest
0 голосов
/ 05 апреля 2019

Я недавно столкнулся с жестким JSON (который я не контролирую, поэтому я должен иметь дело с этим):

{
    "someOtherParam":"someValue",
    "attributes":
    {
        "language":["fr", "en"],
        "otherParam":["value1", "value2"]
    }
}

attributes это карта - я незнаю, какие атрибуты он может содержать, поэтому я не могу просто сопоставить его с объектом.В Java я считаю, что мне нужно сопоставить как Map<String,List<String>> как-то.

Я нашел очень полезный пост , который позволил мне написать такой адаптер:

public class MapAdapter extends XmlAdapter<MapAdapter.AdaptedMap, Map<String, List<String>>> {

  public static class AdaptedMap {
    @XmlVariableNode("key")
    List<AdaptedEntry> entries = new ArrayList<>();
  }

  public static class AdaptedEntry {
    @XmlTransient
    public String key;

    @XmlValue
    public List<String> value;
  }

  @Override
  public AdaptedMap marshal(Map<String, List<String>> map) throws Exception {
    AdaptedMap adaptedMap = new AdaptedMap();
    for(Map.Entry<String, List<String>> entry : map.entrySet()) {
      AdaptedEntry adaptedEntry = new AdaptedEntry();
      adaptedEntry.key = entry.getKey();
      adaptedEntry.value = entry.getValue();
      adaptedMap.entries.add(adaptedEntry);
    }
    return adaptedMap;
  }

  @Override
  public Map<String, List<String>> unmarshal(AdaptedMap adaptedMap) throws Exception {
    List<AdaptedEntry> adaptedEntries = adaptedMap.entries;
    Map<String, List<String>> map = new HashMap<>(adaptedEntries.size());
    for(AdaptedEntry adaptedEntry : adaptedEntries) {
      map.put(adaptedEntry.key, adaptedEntry.value);
    }
    return map;
  }

}

И хотя этот общий подход будет работать для простых значений (например, Map<String,String>), здесь при составлении списка он настаивает на отображении списка как простого элемента

{
    "someOtherParam":"someValue",
    "attributes":
    {
        "language":"fr en",
        "otherParam":"value1 value2"
    }
}

Так как жеЯ правильно это делаю?

...