java - GSON 将 JSON 对象识别为原始对象

标签 java android json gson

我正在编写一个相对简单的消息应用程序,它以 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()));
    }
}

MessageUserChannel 均继承自 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/

相关文章:

java - 数组中的第 K 大元素 - LeetCode 问题

java - 回复 Stripe 200 OK

java - 如何在 UNIX 上找到正在运行的 jar 文件路径?

android - 颠覆性的不安装在eclipse kepler上

java - listView 中的 addFooterView 给出 ClassCastException

java - 我真的需要 Java 来编译 Java 吗?

android - 在 RXJava 调用之前未显示进度对话框

json - 如何使用 Azure 函数 Node.js 读取 Json 文件

jquery - 简单的 JQuery Ajax 帖子

java - 将 2D 对象数组 JSON 反序列化为 Java