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 库。
此致,
阿图尔
例如我的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 库。
此致,
阿图尔