例如,我的 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/