这个问题已经被问过很多次了,但是我从他们给出的答案中找不到任何解决方案。

基本上,我使用GSON来创建JSON类的实例,以便对其进行序列化并将其存储到云存储中。

这是代码

Gson gson = new GsonBuilder().disableHtmlEscaping().create();
User user = dbmanager.getUser();
String user_json = gson.toJson(user);
saved_data.put("user", user_json);


dbmanager.getUser();是一个Sql查询,它从android数据库中收集用户并将其作为User类的实例返回。

然后我正在使用加载方法加载数据

public void converLoadData(String data) throws ParseException
{
    if (data == null || data.trim().equals("")) return;

    try {
         User user = new User();
         data = data.replace("\\\\", "\\");
         JSONObject obj = new JSONObject(data);
         System.out.println("data: " + obj.toString());
         JSONObject user_object = obj.getJSONObject("user");
         System.out.println("user " + user_object.toString());
        String last_sync = obj.getString("last_sync");
        java.util.Date db_sync = dbmanager.getLastSync(user.getID());
               }
    catch (JSONException ex) {
        ex.printStackTrace();
        Log.e(TAG, "Save data has a syntax error: " + data, ex);
    }
    catch (NumberFormatException ex) {
        ex.printStackTrace();
        throw new RuntimeException("Save data has an invalid number in it: " + data, ex);
    }
}


数据println的返回就是这个

data: {"current":"{\"title\":\"Puzzle
2\",\"fnMoves\":[],\"solution_path\":\"puzzles\/2\/CKqbKz5f\/7b1886a261b0400768e75dea91948576.json\",\"puzzlecolors\":[0,0,0],\"puzzle_path\":\"puzzles\/2\/CKqbKz5f\/41a0b30fdfdf6685dd50c6019391cc00.tmx\",\"level_id\":2,\"locked\":false,\"level\":2,\"puzzle_site_id\":2,\"id\":2,\"score\":20,\"fnkeys\":1,\"solved\":false,\"difficulty\":1.0}","solved":"[{\"id\":1,\"puzzle_id\":1,\"puzzle_tries\":10,\"user_id\":1}]","user":"{\"personphoto\":\"https:\/\/lh4.googleusercontent.com\/-5XfDNwK1PwI\/AAAAAAAAAAI\/AAAAAAAAPs8\/C0onA9lyKvY\/photo.jpg?sz=50\",\"google_id\":\"fdgsdfgfgfgsdgsdf\",\"personname\":\"Test
Test\",\"last_sync\":\"2014-08-18
22:12:12\",\"lifes\":3,\"highscore\":13,\"ID\":1}","last_sync":"2014-08-18
22:12:12"}


这是错误。此错误与数据值有关,因为我有反斜杠?我将数据(是字符串)传递到JSON对象中,然后尝试收集用户元素。使用此JSONObject user_object = obj.getJSONObject(“ user”);这就是我有错误的地方。有人可以帮我吗?谢谢

org.json.JSONException: Value {"personphoto":"https://lh4.googleusercontent.com/-5XfDNwK1PwI/AAAAAAAAAAI/AAAAAAAAPs8/C0onA9lyKvY/photo.jpg?sz=50","google_id":"104757400111626678244","personname":"George Panayi","last_sync":"2014-08-18 22:12:12","lifes":3,"highscore":13,"ID":1} at user of type java.lang.String cannot be converted to JSONObject




解决方案:我正在使用“删除”方法删除多余的反斜杠和引号,这些引号和引号会导致JSON对象的格式错误

data = data.replace("\\", "");
data = data.replace("\"{", "{");
data = data.replace("}\"", "}");
data = data.replace("\"[", "[");
data = data.replace("]\"", "]");

最佳答案

我可以通过稍微清理JSON对象来使其工作。我认为这只是一个严重的格式化错误。

首先,转义斜线必须统一或除去。我删除了用双引号引起来的那些,但是将它们留在其他地方。

然后,我删除了嵌套对象和数组周围的双引号。 “ {...}”至{...},“ [...]”至[...]

似乎就是所有必要的事情。

{"current":{"puzzle_path":"puzzles\/2\/CKqbKz5f\/41a0b30fdfdf6685dd50c6019391cc00.tmx","solved":false,"score":20,"difficulty":1,"level_id":2,"id":2,"fnkeys":1,"title":"Puzzle\n2","level":2,"solution_path":"puzzles\/2\/CKqbKz5f\/7b1886a261b0400768e75dea91948576.json","puzzlecolors":[0,0,0],"puzzle_site_id":2,"locked":false,"fnMoves":[]},"user":{"ID":1,"lifes":3,"google_id":"fdgsdfgfgfgsdgsdf","highscore":13,"last_sync":"2014-08-18\n22:12:12","personname":"Test\nTest","personphoto":"https:\/\/lh4.googleusercontent.com\/-5XfDNwK1PwI\/AAAAAAAAAAI\/AAAAAAAAPs8\/C0onA9lyKvY\/photo.jpg?sz=50"},"solved":[{"puzzle_id":1,"id":1,"user_id":1,"puzzle_tries":10}],"last_sync":"2014-08-18\n22:12:12"}

08-05 20:13