Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检测gson.fromjson()是否有多余的元素_Java_Json_Gson - Fatal编程技术网

Java 如何检测gson.fromjson()是否有多余的元素

Java 如何检测gson.fromjson()是否有多余的元素,java,json,gson,Java,Json,Gson,我目前正在创建一个类来测试我生成的gson类是否仍然是最新的,这意味着我必须检测是否有任何json元素已经更改、删除或添加。假设我有一个json,它是 { "FloatingText": { "Dodge_Enabled": false, "foo": false }, "General": { "something": false, "somethingelse": false } } floatin

我目前正在创建一个类来测试我生成的gson类是否仍然是最新的,这意味着我必须检测是否有任何json元素已经更改、删除或添加。假设我有一个json,它是

{
  "FloatingText": {
        "Dodge_Enabled": false,
        "foo": false
    },
    "General": {
        "something": false,
        "somethingelse": false
    }
}
floatingtext的类具有以下字段:

@SerializedName("Dodge_Enabled")
@Expose
public Boolean dodgeEnabled;

现在foo字段显然在这里丢失了,我的问题是如何找到如何可靠地检测到这一点,即使json是它的1000倍。gson文档指出,当json与类不匹配时,它应该抛出一个异常,但它与类不匹配,经过一些研究后,它只在类型严重错误时才会抛出异常,因此这是不可能的

我现在的代码正确地检查了丢失或更改的字段,但没有检查新字段

        GameSettings gameSettings = gson.fromJson(json, GameSettings.class);
    for (Field declaredField : gameSettings.getClass().getDeclaredFields()) {
        declaredField.setAccessible(true);
        Object object = declaredField.get(gameSettings);
        if (object == null && !Modifier.isStatic(declaredField.getModifiers())) {
            Assert.fail();
        }

        for (Field declaredSubfield : object.getClass().getDeclaredFields()) {
            declaredSubfield.setAccessible(true);
            Object subObject = declaredSubfield.get(object);
            if (subObject == null && !Modifier.isStatic(declaredSubfield.getModifiers())) {
                System.out.println("Processing went wrong at: " + declaredSubfield + "\n Json: " + json);
                Assert.fail();
            }
        }

    }

您可以做的一件事是反序列化传入的JSON,然后再次序列化它,并检查结果是否与传入的JSON匹配:

GameSettings settings = gson.fromJson( json, GameSettings.class );

String exportedJson = gson.toJson( settings );
if ( !exportedJson.equals( json ) )
{
    Assert.fail();
}
如果有人手工修改了先前导出的JSON并更改了一些关于漂亮打印的内容,这当然会引起警报。但是,如果只是为了向开发人员发出警报以供检查,那么可能就足够了

如果您想输出有关外部表示中的具体差异的更多信息,可以使用检测差异的库:


“gson文档声明,当json与类不匹配时,它应该抛出异常”它到底说了什么?它实际上说的是
抛出:JsonSyntaxException-如果json不是TypeClassSoft对象的有效表示形式
。关于什么构成有效的陈述,有一些解释的余地。如果JSON包含的数据超过了构建类所需的数据量,那么跳过多余的数据仍然会为您留下原始类的有效表示形式。