我正在编写一个相对简单的消息应用程序,它以 JSON 格式保存其日志,并且我正在使用 GSON 库来解析这些日志。我从服务器加载一个 JSON 文件,并将其放入 Gson.toJsonTree()
函数中。我不确定这是预期的,但是当我使用 isJsonSomething()
函数 (isJsonObject
,isJsonAray
) 测试前一个函数的结果时,isJsonNull
,isJsonPrimitive
),isJsonPrimitive
返回 true,我无法将其解析为对象。这是我的 JSON 文件的内容:
{
"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"
}
这是用于将其解析为 POJO 的类:(CLEANUP 注释是我从帖子中删除不相关代码的地方)
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()));
}
}
类 Message
、User
和 Channel
均继承自 JSONType(一个自定义类,具有名为 type 的字段和一些实用方法),并且包含上述 JSON 文件中存在的所有值。
当它到达 gson.toJsonTree(content).getAsJsonObject()
时,我在 Logcat 中收到此错误(为了清晰起见,省略了字符串,它只是完整的文件):
java.lang.IllegalStateException: Not a JSON Object: "String containing all the file with tabs represented as \t"
最佳答案
我猜是这些选项卡导致了您的问题。尝试使用以下方法删除它们:
content = content.replaceAll("\\s","")
这将简单地清除 json 字符串中的任何空格。
顺便说一句,我建议你摆脱 Gson 库并直接使用 android sdk 中提供的 JSONObject。您可以直接使用 json 字符串初始化它,如 new JSONObject(content)
。 :)
关于java - GSON 将 JSON 对象识别为原始对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18592762/