当前位置: 首页 > 知识库问答 >
问题:

GSON:应为字符串,但为BEGIN_对象?

楚勇
2023-03-14

我试图使用GSON解析一些非常简单的JSON。这是我的代码:

    Gson gson = new Gson();

    InputStreamReader reader = new InputStreamReader(getJsonData(url));
    String key = gson.fromJson(reader, String.class);

以下是从url返回的JSON:

{
  "access_token": "abcdefgh"
}

我得到了一个例外:

E/AndroidRuntime(19447): com.google.gson.JsonSyntaxException:     java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2

有什么想法吗?我是格森的新手。

共有3个答案

子车文康
2023-03-14

这是Pojo密钥数据类型不同于json响应时发生的正常解析异常

这是由于Pojo类中的数据类型与网络api响应中的实际数据不匹配

data class ProcessResponse(
        val outputParameters: String,
        val pId: Int 
    )

得到了相同的错误,由于api给响应作为

 {
        "pId": 1",
        "outputParameters": {
          "": ""
        }
    }

这里POJO是输出参数是字符串,但每个api响应它的json

轩辕经赋
2023-03-14

使用Gson JsonParser的另一种“低级”可能性:

package stackoverflow.questions.q11571412;

import com.google.gson.*;

public class GsonFooWithParser
{
  public static void main(String[] args)
  {
    String jsonInput = "{\"access_token\": \"abcdefgh\"}";

    JsonElement je = new JsonParser().parse(jsonInput);

    String value = je.getAsJsonObject().get("access_token").getAsString();
    System.out.println(value);
  }
}

如果有一天你要编写一个定制的反序列化程序,JsonElement将是你最好的朋友。

宣煜
2023-03-14

JSON结构是一个有一个名为“access_token”的元素的对象——它不仅仅是一个简单的字符串。它可以反序列化为一个匹配的Java数据结构,如地图,如下所示。

import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class GsonFoo
{
  public static void main(String[] args)
  {
    String jsonInput = "{\"access_token\": \"abcdefgh\"}";

    Map<String, String> map = new Gson().fromJson(jsonInput, new TypeToken<Map<String, String>>() {}.getType());
    String key = map.get("access_token");
    System.out.println(key);
  }
}

另一种常见的方法是使用与JSON匹配的更具体的Java数据结构。例如:

import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;

public class GsonFoo
{
  public static void main(String[] args)
  {
    String jsonInput = "{\"access_token\": \"abcdefgh\"}";

    Response response = new Gson().fromJson(jsonInput, Response.class);
    System.out.println(response.key);
  }
}

class Response
{
  @SerializedName("access_token")
  String key;
}
 类似资料:
  • 我对gson反序列化有问题 是我儿子 我的kotlin小工具 还有我的反序列化函数 我有这个错误 我不明白什么是错误的,我真的觉得一切都是正确的,我做了多次不同的测试。 你能帮助我吗。

  • 当我只收到列表中的一个项目时,就会出现这个错误。我在服务器端REST Web服务中使用Jersey,只有当列表返回一个元素时,以及当它有但当它有多个异常时,它工作得非常完美,我就是这样做的: Jersey为什么不发送包含一个项目的列表?是泽西岛的虫子吗?有没有办法让它始终序列化为数组? 这是web服务返回0元素时的JSON数据: 这是web服务返回1个元素时的JSON数据: 当web服务返回超过1

  • 我试图将JSON字符串转换为HashMap。下面是我的一些代码: 在这些行的最后一行(我在其中设置数据)抛出异常。 JSON字符串是 {"body":"body","start Date":"2014-05-30 11:00:00","endDate":"2014-05-30 12:00:00","位置":"位置","主题":"主题!"} 我得到的例外是 线程“main”java中出现异常。朗,反

  • 我的java代码 我的JSON 除id外,所有字段均为字符串 我的错误 18/11/26 18:02:55信息mapreduce。作业:任务Id:尝试_1543189350698_0010_m_000000_0,状态:失败错误:com。谷歌。格森。JsonSyntaxException:java。伊奥。EOFEException:com第1行第3列的输入结束。谷歌。格森。格森。fromJson(G

  • 这个错误又回来了! 我是改装的初学者,我看过这篇文章:改装:预期BEGIN_OBJECT但BEGIN_ARRAY 但是即使我试着让它适应我的模型,我仍然不能让它工作。所以我的错误是: 我得到的是: 解析类的属性: IoTGenericDevice子类的属性: 改装电话: 经理:

  • 我知道以前有人问过很多这个问题,但在我的情况下,我找不到解决办法。我请求获得关于POJO(电影)列表的json回复 虽然这是我第一次使用改型,但我在标题中遇到了问题。我正在创建的url是正确的,下面是响应的示例: 这是我的模特 } 我的@GET 我的数据请求类 最后,我想在我的主要活动中做些什么