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

GSON-Json解析错误

司寇旺
2023-03-14
try{            
    JsonElement rawJson =
            GsonUtils.JsonParser.parse(new InputStreamReader(
                new URL("http://api.mineplex.com/pc/player/abc?apiKey=1")
                  .openConnection().getInputStream()));

     }catch(JsonIOException | JsonSyntaxException | IOException e){
                    e.printStackTrace();
        }

public class GsonUtils
{
    public static Gson gson = new Gson();
    public static Gson prettyGson = new GsonBuilder().setPrettyPrinting()
        .create();
    public static JsonParser jsonParser = new JsonParser();
}

是我用来获取JSON并对其进行解析的类。但是当我运行第一个时,它会报告以下堆栈跟踪:

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 2 column 2
    at com.google.gson.JsonParser.parse(JsonParser.java:65)
...
Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 2 column 2
    at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1505)
    at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1386)
    at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:531)
    at com.google.gson.stream.JsonReader.peek(JsonReader.java:414)
    at com.google.gson.JsonParser.parse(JsonParser.java:60)
    ... 13 more

它告诉我添加JsonReader。将lenient(true)设置为我的代码,但我的代码不使用JsonReader。那么如何将setLenient(true)添加到代码中?

编辑:添加API响应(格式化):

{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Invalid API Key. To get an api key use the /api command in game"
}

共有1个答案

诸葛砚
2023-03-14

我想你可能把GSON库的使用复杂化了。以下代码片段在IntelliJ中对我本地工作正常:

Gson gson = new Gson();
String input = "{\"statusCode\": 401, error\": \"Unauthorized\", \"message\": \"Invalid API Key. To get an api key use the /api command in game\"}";
JsonElement json = gson.fromJson(input, JsonElement.class);
System.out.println(json.toString());

这里我使用了Gson的重载版本。fromJson()接受字符串,但也有一个版本接受文件读取器。

在您的情况下,您可以尝试以下方法:

JsonReader reader = new JsonReader(new InputStreamReader(
            new URL("http://api.mineplex.com/pc/player/abc?apiKey=1")
              .openConnection().getInputStream()));
JsonElement json = gson.fromJson(reader, JsonElement.class);
// use your JsonElement here
 类似资料:
  • 如何使用GSON解析这个json? 我的代码: 我的stacktrace com.google.gson.JsonSyn出租车异常:java.lang.IllegalStateExctive:预期BEGIN_OBJECT但BEGIN_ARRAY在第1行第2列路径$com.google.gson.internal.bind.ReflecteTypeAdapterFactory$Adapter.rea

  • 我很难将具有可变内容的JSON对象解析为Java对象。 我的JSON如下所示: 通过一个典型的Json到Java对象转换器运行这段代码是不起作用的,因为它不能映射到一个简单的POJO。 我尝试转换为,但不出所料,出现了一个异常: Edit:正如注释中所指出的,提供的JSON数据不是以有效的键值对形式提供的。我已经联系了API提供商,他们会解决这个问题的。 在我找到一个处理这个问题的方法之前,我将保

  • 问题内容: 我在解析从javascript获取的JSON时遇到问题。JSON的格式是这样的: 到目前为止,我已经能够做到这一点: 但是我现在还需要用这些位置创建一个类。我一直在上课,因为我先尝试打印输出,但是我无法进一步细分它。我收到此错误消息: java.lang.IllegalStateException:这不是JSON数组。 我的代码是这样的: 我也尝试过这种方式: 在这种情况下,我得到:

  • 我正在使用凌空OkHttp从服务器获取一些数据。 响应是一个包含JSON的字符串,我想使用GSON/POJO解析它。 我得到错误: 预期BEGIN_OBJECT,但在第1行第1列路径$上是STRING 尝试解析时。 原因:java.lang.IllegalStateException:预期BEGIN_OBJECT但在第1行第1列路径$ com.google.gson.stream.JsonRead

  • 问题内容: 但是我无法从中得到答案。上面链接的答案: 它运作良好,但我想对泛型使用隐式运算符。见下文: 然后,我尝试将Class参数传递给方法: 然后出现一个错误: 谁能告诉我为什么会出现此错误?TypeToken类不支持隐式运算​​符吗? 问题答案: 您可以这样: