web-dev-qa-db-ja.com

JSON無効なUTF-8中間バイト

(Jackson、この場合)JSONエンジンがUTF-8でエンコードされていないJSONを解析しようとすると、このエラーが発生します。

UTF-16など、UTF-8とは異なるものを予期する必要があることをエンジンに伝える方法

HttpHeaders requestHeaders = createSomeHeader();
RestTemplate restTemplate = new RestTemplate();
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
String url = "someurl"
ResponseEntity<MyObject[]> arrayResponseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, MyObject[].class);

エラーログ:

Caused by: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Invalid UTF-8 middle byte 0x20
at [Source: org.Apache.http.conn.EofSensorInputStream@44d397b0; line: 92, column: 42]; nested exception is org.codehaus.jackson.JsonParseException: Invalid UTF-8 middle byte 0x20
at [Source: org.Apache.http.conn.EofSensorInputStream@44d397b0; line: 92, column: 42]
at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.Java:138)
at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.Java:154)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.Java:74)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.Java:622)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.Java:608)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.Java:449)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.Java:404)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.Java:380)
... 4 more
Caused by: org.codehaus.jackson.JsonParseException: Invalid UTF-8 middle byte 0x20
at [Source: org.Apache.http.conn.EofSensorInputStream@44d397b0; line: 92, column: 42]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.Java:1213)
at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.Java:375)
at org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidOther(Utf8StreamParser.Java:2132)
at org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidOther(Utf8StreamParser.Java:2139)
at org.codehaus.jackson.impl.Utf8StreamParser._decodeUtf8_3fast(Utf8StreamParser.Java:1962)
30
virtual82

JSONデータは、UTF-8、UTF-16、またはUTF-32としてエンコードする必要があります。 JSONデコーダーは、バイトストリームの 最初の4つのオクテットを調べる によってエンコードを決定できます。

       00 00 00 xx  UTF-32BE
       00 xx 00 xx  UTF-16BE
       xx 00 00 00  UTF-32LE
       xx 00 xx 00  UTF-16LE
       xx xx xx xx  UTF-8

サーバーが何らかの不正なエンコード(ISO-8859-1、windows-1252など)でデータをエンコードしているようです。

29
McDowell

JavaクライアントアプリケーションでこのようなJSONをシリアル化していたときにこの例外が発生しました

String json = mapper.writeValueAsString(contentBean);

サーバー側では、Spring BootをREST Endpointとして使用していました。例外は次のとおりです。

ネストされた例外はcom.fasterxml.jackson.databind.JsonMappingException:無効なUTF-8開始バイト0xaa

私の問題は、HTTPクライアントで正しいエンコーディングを設定していないことでした。これは私の問題を解決しました:

updateRequest.setHeader("Content-Type", "application/json;charset=UTF-8");
StringEntity entity= new StringEntity(json, "UTF-8");
updateRequest.setEntity(entity);

Android設定コンテンツタイプHttpPost

17
razvang

Notepad2を使用してJSONファイルを保存した後にこれを取得したので、Notepad ++でそれを開き、「UTF-8に変換」と言う必要がありました。それはうまくいきました。

3
EpicPandaForce

MapperからJSONをStringとして取得し、自分で作成したため、異なるプラットフォーム間でこの問題が一貫してありませんでした。 ANSIとしてファイルに入れられることもあれば、UTF8として正しく書き込まれることもありました。に切り替えた

mapper.writeValue(file, data);

マッパーにファイル操作を行わせると、正常に動作し始めました。

0
user3610939

偶然に他の人を助けるかもしれない関連する逸話を共有します。

PowerShellを介してPowerShellスクリプトを実行しているときにこの正確なエラー(Invalid UTF-8 middle byte 0x3f)が発生しました統合スクリプト環境(ISE)。 ISEの外部で実行される同一のスクリプトは正常に動作します。コードはConfluence v3およびv5.x REST APIを使用します。このエラーはConfluence v5.xサーバーでログに記録されます-おそらくISEが何らかの理由でリクエストを模倣するためです。

0
ScottWelker