GSON将JSON对象标识为原始

时间:2013-09-03 12:49:36

标签: java android json gson

我正在编写一个相对简单的消息传递应用程序,它以JSON格式保存其日志,我正在使用GSON库来解析这些。我从服务器加载一个JSON文件,并通过Gson.toJsonTree()函数。我不确定这是预期的,但是当我使用isJsonSomething()函数(isJsonObjectisJsonArayisJsonNull,{{1}测试上一个函数的结果时}),isJsonPrimitive返回true,我无法将其解析为对象。这是我的JSON文件的内容:

isJsonPrimitive

以下是用于将其解析为POJO的类:( CLEANUP注释是我从帖子中删除不相关代码的地方)

{
    "users": [
        {
            "picture": "", 
            "type": "user", 
            "name": "kroltan"
        }
    ], 
    "description": "No description", 
    "messages": [

        {
            "content": "something", 
            "time": "2013-08-30 00:38:17.212000", 
            "type": "message", 
            "author": "someone"
        }
    ], 
    "type": "channel", 
    "name": "default"
}

package com.example.testapp; //CLEANUP: All needed imports import com.example.testapp.data.*; import com.google.gson.*; public class JSONConverter { public interface JsonTypeLoadedListener { public void onSucess(JSONType jsonType); public void onFailure(Exception e); } public static final String DATE_FORMAT = "dd-MM-yyyy HH:mm:ss.SSS"; public static final HashMap<String, Class<?>> JSON_TYPES = new HashMap<String, Class<?>>(); public JSONConverter() { JSON_TYPES.clear(); JSON_TYPES.put("channel", Channel.class); JSON_TYPES.put("user", User.class); JSON_TYPES.put("message", Message.class); } public void loadFromURL(final URL url, final JsonTypeLoadedListener listener) { new Thread(new Runnable() { @Override public void run() { JsonObject result = null; Gson gson = new GsonBuilder().setDateFormat(DATE_FORMAT).create(); if (url.getProtocol().equals("http")) { try { String content = //Loads from a server, omitted for clarity result = gson.toJsonTree(content).getAsJsonObject(); conn.disconnect(); } catch (Exception e) { e.printStackTrace(); listener.onFailure(e); return; } } else if (url.getProtocol().equals("file")) { try { String content = //Loads from a file, omitted for clarity result = gson.toJsonTree(content).getAsJsonObject(); br.close(); } catch (Exception e) { e.printStackTrace(); listener.onFailure(e); return; } } listener.onSucess((JSONType) gson.fromJson(result, JSON_TYPES.get(result.get("type").getAsString()))); } }, "URLLoader").start(); } public JSONType loadFromString(String s) { Gson gson = new Gson(); JsonObject result = gson.toJsonTree(s).getAsJsonObject(); return (JSONType) gson.fromJson(result, JSON_TYPES.get(result.get("type").getAsString())); } } MessageUser都继承自JSONType(一个带有名为type和一些实用程序方法的字段的自定义类),并包含上述JSON中存在的所有值文件。

当它达到Channel时,我在Logcat中收到此错误(为清楚起见,省略了字符串,它只是完整文件):

gson.toJsonTree(content).getAsJsonObject()

1 个答案:

答案 0 :(得分:1)

我猜这些标签会导致您的问题。尝试删除它们:

content = content.replaceAll("\\s","")

这只会从任何空格中清除你的json字符串。

顺便说一下,我建议你摆脱Gson库并直接使用android sdk中提供的JSONObject。您可以使用json字符串直接初始化它,如new JSONObject(content)。 :)