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

标签 java json pojo

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

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

因为每次我的 json 文本都会带有不同的数字,即内页标签。

如何将其转换为 Java 等效类?

目前我生成的java类是这样的。

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

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

_42010 类包含 "pageid":42010,"ns":0,"title":"Queen (band)" 等内部字段,因为我每次在pages内都会收到新号码,但它不起作用。它仅适用于特定的 json 文本。

最佳答案

您可以使用忽略更改数字的自定义反序列化器。例如:

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 的条目,然后填充该类。

运行我的测试会给你:

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

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

问候,

阿图尔

关于java - JSON 文本到 Java 的转换问题与随机数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39613136/

相关文章:

java - 在方法中重新分配引用是如何工作的?

java - 类型删除后何时转换函数的通用返回值?

java - 为什么在实例化Object时需要在具有Parameterized Constructor的POJO文件中声明Default constructor?

java - 如何从 java 中的 stringbuilder 对象中删除前 3 行

java - BadPaddingException 与 Jasypt 库

c++ - Poco 迭代嵌套的 JSON 对象

javascript - CSV 文件到 Javascript 中的 Json

java - 使用 class.cast 转换从 Redis 接收的对象失败,使用 ObjectMapper.convertValue 工作

java - 检索 POJO 中的 firebase hashmap 数据

java - 我已经从 h2o 下载了一个 pojo,编译了它,但是我该如何使用它呢?