GSON解析用于更改json数据

时间:2014-10-12 16:43:41

标签: java json gson

我正在使用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 。有什么想法吗?

-Regards

2 个答案:

答案 0 :(得分:2)

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

您可以使用自定义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;
        }
    }
}

答案 1 :(得分:0)

如果结果发生变化,我认为你必须解析你的json。

替换第一个&#34;结果&#34;到&#34; FirstResult&#34; ,并取代第二个&#34;结果&#34;到&#34; SecondResult&#34;。

你的json必须看起来像这样:

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

您可以将json解析为Java Objects。如果你有第一个结果解析到FirstResultObject.java,如果你有第二个结果解析到SecondResult.java

SecondResult.java

public class SecondResult
{
    private String noOfErrors;

    private String severity;

    public String getNoOfErrors ()
    {
        return noOfErrors;
    }

    public void setNoOfErrors (String noOfErrors)
    {
        this.noOfErrors = noOfErrors;
    }

    public String getSeverity ()
    {
        return severity;
    }

    public void setSeverity (String severity)
    {
        this.severity = severity;
    }
}

FirstResult.java

public class FirstResult
{
    private String EndTime;

    private String StartTime;

    public String getEndTime ()
    {
        return EndTime;
    }

    public void setEndTime (String EndTime)
    {
        this.EndTime = EndTime;
    }

    public String getStartTime ()
    {
        return StartTime;
    }

    public void setStartTime (String StartTime)
    {
        this.StartTime = StartTime;
    }
}