2017-07-03 4 views
0

Ich habe ein JSON mit doppelten Schlüsseln wie unten gezeigt.Repräsentieren Sie JSON mit doppelten Schlüsseln als Multimap

{ 
     "name": "Test", 
     "attributes": [{ 
      "attributeName": "One", 
      "attributeName": "Two", 
      "attributeName": "Three" 
     }] 
    } 

Als ich es zu einem Map<String, Object> Jackson-Transformation, ist es, wie unten gezeigt umgewandelt.

{name = Test, Attribute = [{attribute = Drei}]}

Der Wert des letzten Vorkommens von Attributnamen berücksichtigt. Gibt es eine Möglichkeit, Jackson zu erklären, es stattdessen als Multimap darzustellen? Ich bin in Ordnung, jede Implementierung von Multimap zu verwenden. Meine aktuellen Code ist wie unten dargestellt:

import java.util.HashMap; 
import java.util.Map; 

import com.fasterxml.jackson.core.type.TypeReference; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class TestJSON { 

    public static void main(String[] args) throws Exception{ 
     ObjectMapper mapper = new ObjectMapper(); 
     String json = "{\"name\": \"Test\",\"attributes\": [{\"attributeName\": \"One\",\"attributeName\": \"Two\",\"attributeName\": \"Three\"}]}"; 
     Map<String, Object> map = new HashMap<>(); 
     map = mapper.readValue(json, new TypeReference<Map<String, Object>>(){}); 
     System.out.println(map); 
    } 

} 
+0

Wie wäre es, den JSON zu reparieren und stattdessen gültig zu machen? Siehe https://stackoverflow.com/questions/5306741/do-json-keys-need-to-be-unique –

Antwort

0

denken Sie nicht, dass Jackson sie in seiner Heimat Art und Weise behandelt, aber Sie können diese JSON einfache POJO wickeln und Multimap aus ihm heraus. Beispiel:

public class Attribute { 
    private String attributeName; 

    // getter and setter here 
} 

public class AttributeContainer { 
    private String name; 
    private List<Attribute> attributes; 

    public Multimap<String, String> getAttributeMultiMap() { 
     ImmutableMultimap.Builder<String, String> builder = ImmutableMultimap.builder(); 
      for (Attribute attribute : attributes) { 
      builder.put("attributeName", attribute.getAttributeName()) 
      } 
     return builder.build(); 
    } 

    // getters and setters here 
} 

public void main(String[] args) { 
    ObjectMapper mapper = new ObjectMapper(); 
    String json = "{\"name\": \"Test\",\"attributes\": [{\"attributeName\": \"One\",\"attributeName\": \"Two\",\"attributeName\": \"Three\"}]}"; 
    AttributeContainer attributeContainer; 
    attributeContainer = mapper.readValue(json, new TypeReference<AttributeContainer>(){}); 

    System.out.println(attributeContainer.getAttributeMultiMap()); 
} 
+0

Darf ich wissen, welche Implementierung von Multimap Sie verwenden? – Beginner

+0

Sicher, es ist [Guave] (https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/ImmutableMultimap.html#builder()) – rxn1d

+0

Ich habe Probleme beim Erstellen von Multimap. Darf ich wissen, welche Version von Guava Sie verwenden? – Beginner

Verwandte Themen