2017-07-03 4 views
0

J'ai un JSON avec des clés en double comme indiqué ci-dessous.Représente JSON avec des clés en double en tant que Multimap

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

Quand je transforme à un Map<String, Object> en utilisant Jackson, il est transformé comme indiqué ci-dessous.

{name = test, attributs = [{attributeName = Trois}]}

La valeur de la dernière occurrence du nom d'attribut est considéré. Existe-t-il un moyen de dire à Jackson de le représenter comme un Multimap à la place? Je peux utiliser n'importe quelle implémentation de Multimap. Mon code actuel est comme indiqué ci-dessous:

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

Que diriez-vous de corriger le JSON et de le rendre valide? Voir https://stackoverflow.com/questions/5306741/do-json-keys-need-to-be-unique –

Répondre

0

Ne pensez pas que Jackson va gérer dans sa manière native, mais vous pouvez envelopper ce JSON POJO simple et obtenir Multimap sortir. Exemple:

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

Puis-je savoir quelle implémentation de Multimap vous utilisez? – Beginner

+0

Bien sûr, c'est [goyave] (https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/ImmutableMultimap.html#builder()) – rxn1d

+0

J'ai des problèmes dans la construction de Multimap. Puis-je savoir quelle version de goyave vous utilisez? – Beginner