使用Gson创建JSON时,POJO中黑字段的影响

时间:2013-01-18 00:36:02

标签: java json gson

我正在尝试将JSON字符串转换为POJO和从POJO转换JSON字符串。我想知道是否最好为不同类型的json设置一个新的类定义。因为我认为google gson必须解析空字段会降低它的速度。(不明显,但仍然。我认为值得进行实验并在此处发布。)例如,记录客户端可能是。

public class CustomJSON {
    private String name;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

但我可以从客户那里收到其他东西,例如。最喜欢的颜色,食物等。

public class CommonJSON {
    private String name;
    private String food;
    private String music;

    //getters and setters.
}

所以我参加了测试。

CustomJson与上面相同,并且使用CommonJSON我添加了50个其他未使用的空字段。

public class CommonJSON {
    private String name;
    private String a;
          ...
    private String ax;

    //getters and setters.
}

我运行测试的主要方法如下。

public static void main(String[] args) {
        // TODO Auto-generated method stub


        String theJSON = "";

        int passes = 100;
        long start;
        long finish;
        long exeTime;

        Gson gson = new Gson();

        //custom JSON
        start = System.nanoTime();
        for(int i=0;i<passes;i++)
        {
            CustomJSON custom = new CustomJSON();
            custom.setName("StackOverFlow");            
            theJSON = gson.toJson(custom);
        }
        finish = System.nanoTime();
        System.out.println(theJSON);
        exeTime = finish-start;
        System.out.println("Custom JSON \n\t>\t "+(exeTime)+" Nano seconds");
        System.out.println(" \t>\t "+Math.round((exeTime)/1000000.0)+" Micro seconds\n");

    //common JSON
    start= System.nanoTime();
    for(int i=0;i<passes;i++)
    {
        CommonJSON toClientJSONd = new CommonJSON();
        toClientJSONd.setName("StackOverFlow");
        theJSON = gson.toJson(toClientJSONd);
    }
    finish = System.nanoTime();
    System.out.println(theJSON);
    exeTime = finish-start;
    System.out.println("Common JSON \n\t>\t "+(exeTime)+" Nano seconds");
    System.out.println(" \t>\t "+Math.round((exeTime)/1000000.0)+" Micro seconds");

}

结果并不像我预期的那样。通过100次传递,普通课程在我的机器上完成了10ms。如果我增加通过次数,公共类最终会开始落后。

什么使普通班开始更快? 我应该在我的代码中担心这个问题,还是只使用一个类来为所有jsons创建一个公共类?

如果有人想运行它,我可以提供完整的源代码和日食项目。

2 个答案:

答案 0 :(得分:2)

您似乎正在体验JVM升温的效果。有关详细信息,请参阅this SO帖子。

答案 1 :(得分:0)

回答我问题的另一部分。对于Simple JSON对象,它更适合使用GSON lib中的JsonObject并添加属性。

JsonObject json = new JsonObject();
json.addProperty("myBool", false);