2017-09-04 1 views
0

[Ce n'est pas un double de Can not instantiate value of type from JSON String; no single-String constructor/factory method: qui est un beaucoup plus simple POJO et JSON. La solution dans mon cas était différent aussi bien]JsonMappingException: pas de constructeur unique chaîne/méthode usine

JSON Je veux analyser et créer un POJO de:.

{ 
    "test_mode": true, 
    "balance": 1005, 
    "batch_id": 99, 
    "cost": 1, 
    "num_messages": 1, 
    "message": { 
     "num_parts": 1, 
     "sender": "EXAMPL", 
     "content": "Some text" 
    }, 
    "receipt_url": "", 
    "custom": "", 
    "messages": [{ 
     "id": 1, 
     "recipient": 911234567890 
    }], 
    "status": "success" 
} 

Si la réponse se trouve être une erreur, il ressemble à:

{ 
    "errors": [{ 
     "code": 80, 
     "message": "Invalid template" 
    }], 
    "status": "failure" 
} 

Voici le POJO que je l'ai défini:

@Data 
@Accessors(chain = true) 
public class SmsResponse { 

    @JsonProperty(value = "test_mode") 
    private boolean testMode; 

    private int balance; 

    @JsonProperty(value = "batch_id") 
    private int batchId; 

    private int cost; 

    @JsonProperty(value = "num_messages") 
    private int numMessages; 

    private Message message; 

    @JsonProperty(value = "receipt_url") 
    private String receiptUrl; 

    private String custom; 

    private List<SentMessage> messages; 

    private String status; 

    private List<Error> errors; 

    @Data 
    @Accessors(chain = true) 
    public static class Message { 

     @JsonProperty(value = "num_parts") 
     private int numParts; 

     private String sender; 

     private String content; 
    } 

    @Data 
    @Accessors(chain = true) 
    public static class SentMessage { 

     private int id; 

     private long recipient; 
    } 

    @Data 
    @Accessors(chain = true) 
    public static class Error { 

     private int code; 

     private String message; 
    } 

} 

les annotations @Data (dit Lombok pour générer automatiquement des getters, setters, toString() et hashCode() méthodes pour la classe) et @Accessors (indique à Lombok de générer les setters de telle sorte qu'ils peuvent être chaînés) sont de Project Lombok.

On dirait une configuration simple, mais chaque fois que je lance:

objectMapper.convertValue(response, SmsResponse.class); 

Je reçois le message d'erreur:

Can not instantiate value of type [simple type, class com.example.json.SmsResponse] 
from String value ... ; no single-String constructor/factory method 

Pourquoi ai-je besoin d'un constructeur unique chaîne pour SmsResponse, et si Alors, quelle chaîne est-ce que j'accepte?

+0

Ce n'est pas un doublon: j'avais déjà regardé cette question. Voir mon explication et la réponse acceptée. – markvgti

Répondre

1

parser et map une chaîne JSON avec ObjectMapper vous devez utiliser la méthode readValue:

objectMapper.readValue(response, SmsResponse.class); 
+0

Vous avez absolument raison! C'était une erreur très stupide de ma part (j'ai déjà utilisé readValue)! – markvgti