gpt4 book ai didi

java - GSON解析改变json数据

转载 作者:行者123 更新时间:2023-11-30 03:43:21 25 4
gpt4 key购买 nike

我正在使用 GSON 库解析 JSON 数据,我面临的问题是,我的 json 数据的一部分不断变化,下面是我的 JSON 数据的外观。

  {
"body": [{
"result": [
{
"EndTime": "1411495899000",
"StartTime": "1411495360000"
},
{
"EndTime": "1411495359000",
"StartTime": "1411494784000"
}],
"rule": {
"ruleid": "73B5EEB4"
}
},
{
"result": [
{
"noOfErrors": "5",
"severity": "high"
},
{
"noOfErrors": "4",
"severity": "low"
}],
"rule": {
"ruleid": "35B5EEB4"
}
}
],
"header": {
"contentver": "5.5"
}
}

因此,在上面的 JSON 数据中,结果数组内容根据ruleid不断变化,我想为结果选择java bean运行时基于ruleid的内容。有什么想法吗?

-问候

最佳答案

嗯,这将是一个很长的答案......

您可以使用自定义 JsonDeserializer 根据 ruleid 反序列化 json 字符串的变量部分。

public class MessageAdapter implements JsonDeserializer<Message> {

private Map<String, Class<? extends Result>> ruleToResultClassMap;

public MessageAdapter() {
this.ruleToResultClassMap = new HashMap<String, Class<? extends Result>>();
ruleToResultClassMap.put("73B5EEB4", DurationResults.class);
ruleToResultClassMap.put("35B5EEB4", ErrorResults.class);
}

@java.lang.Override
public Message deserialize(JsonElement json, java.lang.reflect.Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject messageObject = json.getAsJsonObject();
JsonArray bodyArray = messageObject.getAsJsonArray("body");

List<Result> results = new ArrayList<Result>();
for (JsonElement bodyElement : bodyArray) {
JsonObject resultObject = bodyElement.getAsJsonObject();
JsonObject ruleObject = resultObject.getAsJsonObject("rule");
String ruleId = ruleObject.getAsJsonPrimitive("ruleid").getAsString();
Class<? extends Result> resultClass = ruleToResultClassMap.get(ruleId);
if (resultClass != null) {
Result result = context.deserialize(resultObject, resultClass);
results.add(result);
} else {
throw new IllegalArgumentException("Illegal ruleId: " + ruleId);
}
}
return new Message(results, context.<Header>deserialize(messageObject.getAsJsonObject("header"), Header.class));
}
}

您需要使用GsonBuilder注册自定义反序列化器:

    GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Message.class, new MessageAdapter());
Gson gson = gsonBuilder.create();

String jsonString = null; // your json string
Message message = gson.fromJson(jsonString, Message.class);

这里Message是json字符串的根POJO,你可能有自己的。为了完整引用,我在此处包含所有类:

public class Message {

private List<? extends Result> body;
private Header header;

public Message(List<? extends Result> body, Header header) {
this.body = body;
this.header = header;
}


public List<? extends Result> getBody() {
return body;
}

public Header getHeader() {
return header;
}

}

public class Header {
private String contentver;

public Header(String contentVer) {
this.contentver = contentVer;
}

public String getContentVer() {
return contentver;
}
}

public interface Result {
public Rule getRule();
}

public final class Rule {
private String ruleid;

public String getRuleid() {
return ruleid;
}
}

public class DurationResults implements Result {
private Duration[] result;
private Rule rule;

public Duration[] getResult() {
return result;
}

@Override
public Rule getRule() {
return rule;
}

public static final class Duration {
private long EndTime;
private long StartTime;

public long getStartTime() {
return StartTime;
}

public long getEndTime() {
return EndTime;
}
}
}

public class ErrorResults implements Result {
private Error[] result;
private Rule rule;

public Error[] getResult() {
return result;
}

@Override
public Rule getRule() {
return rule;
}

public static final class Error {
private int noOfErrors;
private String severity;

public int getNoOfErrors() {
return noOfErrors;
}

public String getSeverity() {
return severity;
}
}
}

关于java - GSON解析改变json数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26327487/

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