[解決済み] Jackson JSON パーサーが無効な utf-8 の開始バイトを使用している
2022-02-18 15:20:15
質問
以下のJSONをパースしようとしているのですが、ずっと
JsonParseException
:
{
"episodes":{
"description":"Episode 3 – Oprah's Surprise Patrol from 1\/20\/04\nTake a trip down memory lane and hear all your favorite episodes of The Oprah Winfrey Show from the last 25 seasons -- everyday on your radio!"
}
}
も、このJSONでは失敗します。
{
"episodes":{
"description":"After 20 years in sports talk…he’s still the top dog! Catch Christopher “Mad Dog” Russo weekday afternoons on Mad Dog Radio as he tells it like it is…Give the Doggie a call at 888-623-3646."
}
}
例外です。
org.codehaus.jackson.JsonParseException: Invalid UTF-8 start byte 0x96
at [Source: C:\Json Test Files\episodes.txt; line: 3, column: 33]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1291)
at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:385)
at org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidInitial(Utf8StreamParser.java:2236)
at org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidChar(Utf8StreamParser.java:2230)
at org.codehaus.jackson.impl.Utf8StreamParser._finishString2(Utf8StreamParser.java:1467)
at org.codehaus.jackson.impl.Utf8StreamParser._finishString(Utf8StreamParser.java:1394)
at org.codehaus.jackson.impl.Utf8StreamParser.getText(Utf8StreamParser.java:113)
at com.niveus.jackson.Main.parseEpisodes(Main.java:37)
at com.niveus.jackson.Main.main(Main.java:13)
コード
public static void main(String [] args) {
parseEpisodes("C:\\Json Test Files\\episodes.txt");
}
public static void parseEpisodes(String filename) {
JsonFactory factory = new JsonFactory();
JsonParser parser = null;
String nameField = null;
try {
parser = factory.createJsonParser(new File(filename));
parser.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
parser.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true);
JsonToken token = parser.nextToken();
nameField = parser.getText();
String desc = null;
while (token != JsonToken.END_OBJECT) {
if (nameField.equals("episodes")) {
while (token != JsonToken.END_OBJECT) {
if (nameField.equals("description")) {
parser.nextToken();
desc = parser.getText();
}
token = parser.nextToken();
nameField = parser.getText();
}
}
token = parser.nextToken();
nameField = parser.getText();
}
System.out.println(desc);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
解決方法は?
33列目の文字が
–
となる理由は、バイトの
0x96
は、ファイルが物理的にWindows-1252としてエンコードされているためです。Windows-1252はjsonの有効なエンコーディングではないので、UTF-8でファイルを保存する必要があります。この方法は、使用しているテキストエディタに依存します。
参照 JSON RFC :
エンコーディング
JSONテキストは、Unicodeでエンコードしなければならない(SHALL)。 デフォルトのエンコーディングは
UTF-8です。
関連
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み】「java -cp」と「java -jar」の違い?
-
[解決済み] "java.nio.charset.MalformedInputException" を避けるために、すべての包括的なCharset。入力の長さ= 1"?
-
[解決済み] Jacksonでシリアライズ(JSON) - "No serializer found "と表示される?
-
[解決済み] Jackson JSONとHibernate JPAによる無限再帰の問題
-
[解決済み] UnicodeDecodeError: 'utf8' コーデックは位置 0 のバイト 0xa5 をデコードできない: 不正なスタートバイトだ
-
[解決済み】Jackson JSONマッパーでjava 8 java.timeをシリアライズ/デシリアライズする。
-
[解決済み] JacksonでJSON文字列をJsonNodeにパースする方法は?
-
[解決済み】JacksonでJavaオブジェクトをJSONに変換する
-
[解決済み] Jacksonを使用して、JSON文字列をPretty Print JSON出力に変換する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】StringUtils.isBlank() vs String.isEmpty()
-
[解決済み】エラー。Selection does not contain a main type
-
[解決済み】popBackStack()とreplace()の操作はどう違うのですか?
-
[解決済み】Java、"変数名 "を変数に解決することができない
-
[解決済み】不正な反射的アクセスとは?
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み] Hide Utility Class Constructor : ユーティリティクラスはパブリックまたはデフォルトコンストラクタを持つべきではありません。
-
[解決済み] JavaでSSLピアが正しくシャットダウンされない
-
[解決済み】Javaの".class expected "について