JSON 文本到 Java 随机数生成的转换问题

JSON text to Java conversion issue with random number generation

例如我的JSON文本是这样的。

"pages":{"42010":{"pageid":42010,"ns":0,"title":"Queen (band)"}}

因为每次我的 json 文本都带有不同的编号,这些编号位于页面标签内。

我如何将其转换为 Java 等效的 class?

目前我生成的javaclass是这样的。

@Generated("org.jsonschema2pojo")
public class Pages {

    @SerializedName("42010")
    @Expose
    private _42010 _42010;
}

_42010 class 包含像 "pageid":42010,"ns":0,"title":"Queen (band)" 这样的内部字段,因为我每次都在 pages 中获取新数字,它不起作用。它仅适用于特定的 json 文本。

为什么不使用像 jackson 或 org.json 这样的 JSON 库?

让你的json像

一样正确
{
"pages":{
       "42010":{
               "pageid":42010,
               "ns":0,
               "title":"Queen (band)"
               }
        }
}

您将能够像这样使用它:

JSONObject jsonObjet = new JSONObject(yourJson);
jsonObjet.get("pages");

理想情况下应该使用 Map

这有助于将值形成为 Map<Integer, Pojo>

假设

public class Pojo{
    private int pageid;
    private String title;
    private int ns;
    // getter and setter
}

这满足了保存运行时生成的随机数字的要求,

您可以使用忽略变化数字的自定义解串器。例如:

package jacksonTest;

import java.io.IOException;
import java.lang.reflect.Type;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

public class CustomDeserialiser {


public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
    String json = "{\"42010\":{\"pageid\":42010,\"ns\":0,\"title\":\"Queen (band)\"}}";
    String json2 = "{\"12345\":{\"pageid\":12345,\"ns\":0,\"title\":\"Queen (band)\"}}";

    Gson g = new GsonBuilder().registerTypeAdapter(Pages.class, new PagesDeserialiser()).create(); 

    Pages fromJson = g.fromJson(json, Pages.class);
    System.out.println(fromJson);

    fromJson = g.fromJson(json2, Pages.class);
    System.out.println(fromJson);
}

public static class PagesDeserialiser implements JsonDeserializer<Pages> {

    @Override
    public Pages deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws com.google.gson.JsonParseException {
        JsonObject object = json.getAsJsonObject();

        Pages p = new Pages();
        object.entrySet().forEach( e -> {
            JsonObject tmp = e.getValue().getAsJsonObject();
            if(tmp.get("pageid") != null) {
                // right object
                p._42010 = new _42010();
                p._42010.ns = tmp.get("ns").getAsInt();
                p._42010.pageid = tmp.get("pageid").getAsInt();
                p._42010.title = tmp.get("title").getAsString();
            }
        });

        return p;
    }

}

public static class Pages {

    _42010 _42010;

    @Override
    public String toString() {
        return _42010.toString();
    }


}

public static class  _42010 {
    int pageid;
    int ns;
    String title;

    @Override
    public String toString() {
        return title + " " + pageid + " " + ns;
    }
}

}

类型页面的反序列化器只是检查条目以找到包含 pageId 的条目,然后填充 class.

运行 我的测试给你:

Queen (band) 42010 0
Queen (band) 12345 0

我假设您使用 Gson 作为 json 库。

此致,

阿图尔