2017-07-27 44 views
-2

問題は、コードの関連するスニペットです:無効なJSONをレスポンスから作成された文字列を読み取るためにJackon ObjectMapperを使用し

Response response = request.get(); 
String responseAsString = response.readEntity(String.class); 
ObjectMapper mapper = new ObjectMapper(); 
JsonNode responseNode = mapper.readTree(responseAsString); 

このコードを実行すると、次の例外が発生します。com.fasterxml.jackson.core.JsonParseException: Unexpected character ('-' (code 45)): was expecting comma to separate OBJECT entries

問題の背景: GET要求を出しており、正常に応答しています。そのレスポンスをStringに変換して、それをJsonNodeに変更して、必要な部分を抽出することができます。私はそれがこのようになりますresponseAsStringプリントアウトする場合:

{ 
    "account": 123456789, 
    "balance": 5602, 
    "dateTime": 2017-06-15T03:29:00, 
    "token": "H77ABC0PPIQ" 
} 

を私は問題はないすべての値のは、文字列として送信されますので、応答がどのように形成されるかに起因していると信じています。私は例えば口座番号などの個々の値を得ることができるようにJSONオブジェクトに応答を変換するかどうかはわかりません

account: long 
balance: long 
dateTime: DateTime 
token: String 

次のように彼らの種類があります。

アドバイスありがとうございます。ありがとう!

+1

無効JSONです。日付は引用符で囲む必要があります。 –

+0

そうですね、間違って質問したことがあります。私は応答を取得し、toStringを実行すると、それは私が得るものです - 無効なJSON。オブジェクトマッパーを使用したり、有効なJSONにするにはどうすればよいですか?ありがとう – SuperCow

+0

ObjectMapperはJSONを解析します。あなたが持っているものがJSONでない場合、それを解析することはできません。ソースに移動し、JSONを修正してください。あるいは、この非JSONを解析できる他のものを使用してください。 –

答えて

1

問題は、形式が正しくないJSONが原因です。 JSONlintのようなツールを使用してJSONを確認できます。 受信したリクエストのペイロードがマーシャリングされているかどうかを確認する必要があります。リクエストに適切なJSONがあれば、コードは正常に動作します。

簡単なテストとして、私はObjectMapperを使用して、シリアル化、印刷、逆シリアル化、およびアカウントオブジェクトの移動を行います。

ドメインクラス(私は簡潔にするためにLombokを使用しています)

@Data 
@AllArgsConstructor 
private class Account { 
    private Integer account; 
    private Integer balance; 
    private String dateTime; 
    private String token; 

} 

テスト:アカウントオブジェクトをシリアライズすることにより、生成された

@Test 
public void test() throws IOException { 

    ObjectMapper mapper = new ObjectMapper(); 
    mapper.enable(SerializationFeature.INDENT_OUTPUT); 
    String responseAsString = mapper.writeValueAsString(new Account(123456789,5602,"2017-06-15T03:29:00","H77ABC0PPIQ")); 
    System.out.print(responseAsString); 
    JsonNode responseNode = mapper.readTree(responseAsString); 

    assertEquals("2017-06-15T03:29:00",responseNode.get("dateTime").textValue()); 
} 

JSON:

{ 
    "account" : 123456789, 
    "balance" : 5602, 
    "dateTime" : "2017-06-15T03:29:00", 
    "token" : "H77ABC0PPIQ" 
} 
+0

お返事ありがとうございます。私が見ている問題は、新しいアカウントを作成しているときです。私が持っているレスポンスから、新しいアカウントの引数をどうやって得られますか? – SuperCow

関連する問題