簡體   English   中英

GSON解析以更改json數據

[英]GSON parsing for changing json data

我正在使用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不斷變化,我想在運行時根據Ruleid選擇Java Bean作為結果內容。 任何想法?

-問候

好吧,這將是一個很長的答案...

你可以使用自定義JsonDeserializer反序列化基礎上,JSON字符串的可變部分ruleid

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;
        }
    }
}

我認為如果結果更改,您必須解析json。

將第一個“結果”替換為“ FirstResult”,然后將第二個“結果”替換為“ SecondResult”。

您的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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM