【问题标题】:Gson parse json array of length 1 into JsonArray object instead of JsonObject object [duplicate]Gson将长度为1的json数组解析为JsonArray对象而不是JsonObject对象[重复]
【发布时间】:2015-05-08 03:39:19
【问题描述】:

使用 Gson,我试图强制我的 json 对象具有一个包含一个元素的数组值。尽管我以这种方式构造 json,但 JsonParser 会创建一个新的 JsonObject 来代替长度为 1 的数组。我系统中的大多数 json 具有大于长度 1 的数组的值并正确解析。

我在尝试将 JsonObject 强制转换为 JsonArray 的实用方法时发现了这一点。它没有像我预期的那样工作。

static JsonArray bruteForceJsonArray(JsonObject object, String key) {
    if(object.get(key).isJsonArray()) {
        return object.get(key).getAsJsonArray();
    } else {
        System.out.println("broken: " + object.toString());
        JsonObject temp = object.get(key).getAsJsonObject();
        String fixed = "{'" + key +  "':[" + temp.toString() + "]}";
        System.out.println("pre-fix: " + fixed);

        //parsing here reduces the array to an object - hot to prevent?     
        temp = new JsonParser().parse(fixed).getAsJsonObject();         
        System.out.println("fixed: " + object.toString());
        return object.get(key).getAsJsonArray();
    }
}

输出:

broken: {"token":{"NER":"O","id":1.0,"word":".","CharacterOffsetEnd":765.0,"Speaker":"PER0","POS":".","lemma":".","CharacterOffsetBegin":764.0}}
pre-fix: {'token':[{"NER":"O","id":1.0,"word":".","CharacterOffsetEnd":765.0,"Speaker":"PER0","POS":".","lemma":".","CharacterOffsetBegin":764.0}]}
fixed: {"token":{"NER":"O","id":1.0,"word":".","CharacterOffsetEnd":765.0,"Speaker":"PER0","POS":".","lemma":".","CharacterOffsetBegin":764.0}}

大多数 json 在系统中正确显示的示例:

{"token":[{"Speaker":"PER0","POS":"IN","lemma":"except","CharacterOffsetBegin":742.0,"NER":"O","id":1.0,"word":"Except","CharacterOffsetEnd":748.0},{"CharacterOffsetEnd":752.0,"Speaker":"PER0","POS":"IN","lemma":"for","CharacterOffsetBegin":749.0,"NER":"O","id":2.0,"word":"for"},{"id":3.0,"word":"extra","CharacterOffsetEnd":758.0,"Speaker":"PER0","POS":"JJ","lemma":"extra","CharacterOffsetBegin":753.0,"NER":"O"},{"Speaker":"PER0","POS":"NN","lemma":"meat","CharacterOffsetBegin":759.0,"NER":"O","id":4.0,"word":"meat","CharacterOffsetEnd":763.0},{"CharacterOffsetEnd":764.0,"Speaker":"PER0","POS":".","lemma":".","CharacterOffsetBegin":763.0,"NER":"O","id":5.0,"word":"."}]}

有没有解决这个问题的聪明方法 - 我可以通过某种方式有效地将我的对象强制放入数组中,这样我就可以在流中处理它们而无需过多的 try/catch 或 if/else 处理?

【问题讨论】:

  • @Raniz 谢谢。我没有使用其他课程。只有 JsonArray 和 JsonObject。这可能是我的问题的核心,所以我正在考虑如何实现你分享的方法。我可能需要为我的 json 的各个级别编写一个适配器,我希望有一个主方法来统治它们。

标签: java arrays json gson


【解决方案1】:
static JsonArray bruteForceJsonArray(JsonObject object, String key) {
    if (object.get(key).isJsonArray()) {
        return object.get(key).getAsJsonArray();
    } else {
        JsonArray oneElementArray = new JsonArray();
        oneElementArray.add(new JsonObject());
        return oneElementArray;
    }
}

虽然,您不应该直接使用JsonObject/JsonArray。为您的数据创建一个 POJO 类并使用 Gson 反序列化 JSON。

【讨论】:

  • 谢谢 - 这真的会帮助我按时完成一个学术项目。此外,我感谢您反对我的方法的建议。在寻找解决方案时,我多次遇到 POJO。我还看到了从 Java 类中序列化和反序列化的方法。很明显,我没有尽可能有效地使用 Gson。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
相关资源
最近更新 更多