首页 > 解决方案 > 使用符号而不是属性的字符串解析 JSON 结构

问题描述

我正在处理 HTTP Rest 查询。维基百科 API 返回一个 JSON。问题是维基百科返回的 JSON 结构。

https://en.wikipedia.org/w/api.php?action=parse§ion=0&prop=text&format=json&page=pizza

这是通过对 Wikipedia API 的休息请求获得的 JSON。要查看完整的 JSON,您可以单击上面的链接。

{
  "parse":
  {
    "title":"Pizza",
    "pageid":24768,
    "text":{"*":"<div class=\...>"}
  }
}

我会使用我没有机会测试的自定义反序列化器来解析它。尝试使用简单的 Gson 解析,如下所示返回 null;

Result res   = new Gson(str,Result.class);

我创建了如下类:

public class Result
{
  private Parse parse;
}

public class Parse 
{
  private String title;
  private int pageid;
  private Text text;
}

public class Text{

 private String *;// what should I call this attribute.

}

我的计划是添加一个自定义反序列化器,如下所示:

public class TextBaseDeserializer implements JsonDeserializer<Text> {

    @Override
    public RespondentBase deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
        return jsonDeserializationContext.deserialize(jsonElement.get("*"),Text.class);
    }

  
}

我正在使用 Gson 来解析它,如下所示:

Gson tmp = new GsonBuilder().registerTypeAdapter(Text.class, new TextBaseDeserializer());
// let's assume that str is the string obtained following Rest based request from Java.
Result res = tmp.parse(str,Result.class);

我已经完成了上述所有代码来处理符号 JSON 属性。我的问题是如何解析这样的 JSON。在上面的例子中,属性是 *

标签: javajsonrest

解决方案


评论中所述,您应该使用@SerializedName("*").

您可以随意命名该字段。我们将在star下面命名它,但也许all更好,因为*可能是通配符?没关系,随便选一个你喜欢的名字。

class Text
{
    @SerializedName("*")
    private String star;
}

测试

String str = "{\"parse\":{\"title\":\"Pizza\",\"pageid\":24768,\"text\":{\"*\":\"<div class=\\\"mw-parser-output\\\">...</div>\"}}}";

Gson tmp = new GsonBuilder().create();
Result res = tmp.fromJson(str, Result.class);
System.out.println(res.getParse().getText().getStar());

输出

<div class="mw-parser-output">...</div>

推荐阅读