gpt4 book ai didi

java - JSON 到 Java : How to model lists of objects into generic object class whose object name from json is variable

转载 作者:行者123 更新时间:2023-11-30 09:28:32 25 4
gpt4 key购买 nike

假设我有以下无法更改的 JSON,因为它是由其他人通过网络提要提供的。我想使用 Jackson 将其解析为 Java 对象。

{
"2002": [
{
"d": "description",
"t": "title"
}
],
"2003": [
{
"d": "description",
"t": "title"
}
]
}

例如,数据表示 ids=2002、2003 ...等的电视节目列表,每个节目都有描述和标题。我想将此数据解析为通用程序类列表,其中每个程序类都有字段 d 和 t。我不想为 2002、2003 等对象设置单独的类。请记住,2002 年、2003 年等 id 直到运行时才为人所知,并且会随着时间的推移而演变,也可能是一长串可能的值。

是否可以将其建模为通用程序列表,其 id 字段等于 json 字符串中的对象名称?换句话说,我不想要这个:

public class AllProgrammes {
private List<com.example._2002> _2002;
private List<com.example._2003> _2003;
// getters and setters
}

但是这应该只包含 List<Programmes> ,并且每个程序对象都应该有一个 id = 2002 或 2003,或者它是什么 id。

谢谢。

最佳答案

如果你可以使用 Google Gson,你可以这样做:

程序类

public class Program {
private String id;
private String title;
private String description;

public Program(String id, String title, String description) {
this.id = id;
this.title = title;
this.description = description;
}

@Override
public String toString() {
return String.format("Program[id=%s, title=%s, description=%s]", this.id, this.title, this.description);
}
}

程序Deserialize.class

import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

class ProgramsDeserializer implements JsonDeserializer<List<Program>> {
@Override
public List<Program> deserialize(JsonElement e, Type type, JsonDeserializationContext jdc) throws JsonParseException {
List<Program> programs = new ArrayList<>(10);
JsonObject root = e.getAsJsonObject();
for (Map.Entry<String, JsonElement> entry : root.entrySet()) {
String id = entry.getKey();
String title = "";
String description = "";
JsonElement arrayElement = entry.getValue();
if (arrayElement.isJsonArray()) {
JsonArray array = arrayElement.getAsJsonArray();
JsonElement objectElement = array.get(0);
if (objectElement.isJsonObject()) {
JsonObject object = objectElement.getAsJsonObject();
title = object.get("t").getAsString();
description = object.get("d").getAsString();
}
}
programs.add(new Program(id, title, description));
}
return programs;
}
}

Gson Example.class

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class GsonExample {
private static final Logger logger = Logger.getLogger(GsonExample.class.getName());
private static final String JSON =
"{"
+ "\"2002\": ["
+ "{"
+ "\"d\": \"description\","
+ "\"t\": \"title\""
+ "}"
+ "],"
+ "\"2003\": ["
+ "{"
+ "\"d\": \"description\","
+ "\"t\": \"title\""
+ "}"
+ "]"
+ "}";

public static void main(String[] args) {
GsonExample e = new GsonExample();
e.run();
}

private void run() {
GsonBuilder builder = new GsonBuilder();
Type type = new TypeToken<List<Program>>(){}.getType();
builder.registerTypeAdapter(type, new ProgramsDeserializer());
Gson gson = builder.create();
List<Program> programs = gson.fromJson(JSON, type);
logger.log(Level.INFO, "{0}", programs);
}
}

关于java - JSON 到 Java : How to model lists of objects into generic object class whose object name from json is variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13988691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com