1. ホーム
  2. java

[解決済み] 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を手動でパースする必要があります。