[解決済み] Gson 1行目62列目でBEGIN_ARRAYを期待したがSTRINGだった [重複].
2022-02-14 07:21:09
質問
次のようなクラスがあります。
final class CFS {
public Map<String, String> files = new HashMap<String, String>();
public List<String> directories = new ArrayList<String>();
}
そして、このコードはjsonをパースするものです。
CFS cfs = JStorage.getGson().fromJson(JSON_STRING, CFS.class);
ここで
JSON_STRING = "{\"directories\" : [\"folder1\", \"folder1/folder2\"], \"files\" : [{\"folder1\" : \"file.txt\"}, {\"folder1/folder2\" : \"file.cfg\"}]}"
JSONは。
{
"directories": ["folder1", "folder1/folder2"],
"files": [
{
"folder1": "file.txt"
},
{
"folder1/folder2": "file.cfg"
}
]
}
出るエラーは
Expected BEGIN_ARRAY but was STRING at line 1 column 62
しかし、私はなぜかわからない、jsonlintによると、jsonは有効である。
なぜこのエラーが発生するのか、何か心当たりはありますか?
どうすればいいですか?
JSONは有効だが、マッピングクラスが有効でない(一部が一致しない)。特に
files
プロパティとしてマッピングすることはできません。
Map<String, String>
を指定されたJSONから読み取ることができます。データを格納するための別の構造を推奨することは、より大きなサンプルを見てみないと難しいのですが、一般的には次のようになります。
このガイド
JSONの構造体とJavaのクラスを対応させる場合。このJSONは
"files": [
{
"folder1": "file.txt"
},
{
"folder1/folder2": "file.cfg"
}
]
はオブジェクトを含む配列を表し、各オブジェクトはマップとして表現するのが最も適切です。つまり、本質的にはマップのリストです。その結果、あなたのJavaオブジェクトはこうなるはずです。
public class CFS {
private List<Map<String, String>> files = new ArrayList<Map<String, String>>(
4);
private List<String> directories = new ArrayList<String>(4);
// Constructors, setters/getters
}
プロパティをプライベートにして、ゲッター/セッターを追加することで修正したことに注意してください。上記のように定義されたクラスで、あなたのプログラムは問題なく動作するはずです。
final Gson gson = new GsonBuilder().create();
final CFS results = gson.fromJson(json, CFS.class);
Assert.assertNotNull(results);
Assert.assertNotNull(results.getFiles());
System.out.println(results.getFiles());
プロデュースします。
[{folder1=file.txt}, {folder1/folder2=file.cfg}]
を保持する必要がある場合、現在の
CFS
構造を使用する場合は、JSONを手動でパースする必要があります。
関連
-
[解決済み] if / for / while 内で "Missing return statement" が発生する。
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み】java.io.IOException: 壊れたパイプ
-
[解決済み] [Solved] java.lang.NoClassDefFoundError: クラスXXXを初期化できませんでした。
-
[解決済み] "java.nio.charset.MalformedInputException" を避けるために、すべての包括的なCharset。入力の長さ= 1"?
-
[解決済み] "BEGIN_OBJECTを期待したが、1行目1列目でSTRINGだった"
-
[解決済み] GSONが "Expected BEGIN_OBJECT but was BEGIN_ARRAY "と投げる?
-
[解決済み] Eclipseが起動できない - Javaは起動したが終了コード=13を返した
-
[解決済み】Gson: StringをJsonObjectに直接変換する(POJOなし)
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Hibernateエラー:同じ識別子値を持つ別のオブジェクトがすでにセッションに関連付けられました。
-
[解決済み】エラー:'if'のない'else'エラー
-
[解決済み】エラー:配列または java.lang.Iterable のインスタンスに対してのみ反復処理を行うことができます。
-
[解決済み】このコンパイルユニットは名前付きモジュールに関連しているため、名前付きパッケージeclipseを宣言する必要があります。
-
[解決済み】popBackStack()とreplace()の操作はどう違うのですか?
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み】java 'jar'が内部コマンドまたは外部コマンドとして認識されない。
-
[解決済み】Hibernateの例外「failed to lazily initialize a collection of role」の解決方法
-
[解決済み] java.sql.SQLException を取得しました。ResultSet が終了した後の操作は許可されません。