2017-04-24 1 views
0

J'utilise le modèle de repos Springs pour publier des données dans JSON vers une API. Malheureusement, les valeurs de ma HashMap contiennent à la fois des doubles et des chaînes.Comment puis-je envoyer correctement un HashMap qui contient à la fois des doublons et des chaînes dans ses valeurs lors de la publication dans une API dans JSON

J'ai essayé d'utiliser un HashMap avec le type de données suivant: HashMap, mais je l'ai trouvé que le résultat JSON ressemble à quelque chose comme ce qui suit à la place:

{ 
    "VARIABLE_1":"0.0000", 
    "VARIABLE_2":"True", 
    "VARIABLE_3":"String" 
} 

Malheureusement, l'API je poste à ne traite pas correctement ces doubles car ils sont envoyés en tant que chaînes. Y a-t-il quelque part que je puisse être indifférent aux types de données, mais que le format HttpEntity double correctement.

Voici un exemple du code que je utilise en fait:

import org.springframework.http.HttpEntity; 
import org.springframework.http.HttpHeaders; 
import org.springframework.http.MediaType; 
import org.springframework.http.ResponseEntity; 
import org.springframework.http.client.CommonsClientHttpRequestFactory; 
import org.springframework.web.client.RestTemplate; 

...

public void postMethod(HashMap<String,Object> input) { 

    CommonsClientHttpRequestFactory requestFactory = new CommonsClientHttpRequestFactory(); 
    restTemplate.setRequestFactory(requestFactory); 
    HttpEntity<HashMap<String,Object>> requestEntity = new HttpEntity<>(input, headers); 

    ResponseEntity<Result> result = restTemplate.postForEntity(uri, requestEntity, Result.class); 
    Result result = result.getBody(); 
} 
+0

Cela me semble être un bon candidat pour utiliser un POJO plutôt qu'une carte. –

+0

Désolé, je ne vois pas clairement où votre carte entre dans votre exemple de code. Est-ce l'argument 'input' du constructeur' HttpEntity'? –

+0

Merci, ça l'efface un peu. Maintenant, quel 'HttpEntity' est-ce? Celui dans Commons HttpCore est une interface; vous ne pouvez pas l'instancier comme ça (ou du tout). –

Répondre

1

Vous pouvez créer un corps JSON personnalisé en accédant directement à la bibliothèque Jackson qui utilise la technologie Spring :

import com.fasterxml.jackson.databind.node.JsonNodeFactory; 
import com.fasterxml.jackson.databind.node.ObjectNode; 

... 

public void postMethod(HashMap<String,Object> input) { 
    ObjectNode jsonBody = JsonNodeFactory.instance.objectNode(); 
    for (Map.Entry<String, Object> entry : input.entrySet()) 
    { 
     String key = entry.getKey(); 
     Object value = entry.getValue(); 

     if (value instanceof Double) 
      jsonBody.put(key, (Double)value); 
     else if (value instanceof Boolean) 
      jsonBody.put(key, (Boolean)value); 
     else 
      jsonBody.put(key, value); 
    } 

    // ... make headers ... 

    HttpEntity<String> requestEntity = new HttpEntity<>(jsonBody.toString(), headers); 

    // ... make the post request ... 
} 

La seule partie stupide est que vous devez jeter votre value être Avant d'appeler le put(), sinon Java appelle le remplacement de la méthode put(String, Object).