【问题标题】:How do I get differences between two json objects using GSON?如何使用 GSON 获取两个 json 对象之间的差异?
【发布时间】:2015-09-01 03:52:24
【问题描述】:

我使用这段代码在 Android 中使用 Gson 比较了两个 JSON 对象:

String json1 = "{\"name\": \"ABC\", \"city\": \"XYZ\"}";
String json2 = "{\"city\": \"XYZ\", \"name\": \"ABC\"}";

JsonParser parser = new JsonParser();
JsonElement t1 = parser.parse(json1);
JsonElement t2 = parser.parse(json2);

boolean match = t2.equals(t1);

有什么方法可以让两个使用 JSON 格式的 Gson 获得两个对象之间的差异

【问题讨论】:

  • 我很确定您必须编写自定义代码才能做到这一点,

标签: java android json gson


【解决方案1】:

如果您将对象反序列化为Map<String, Object>,您也可以使用Guava,您可以使用Maps.difference 来比较两个生成的映射。

请注意,如果您关心元素的顺序Json 不会保留 Objects 字段的顺序,因此此方法不会显示这些比较。

这是你的做法:

public static void main(String[] args) {
  String json1 = "{\"name\":\"ABC\", \"city\":\"XYZ\", \"state\":\"CA\"}";
  String json2 = "{\"city\":\"XYZ\", \"street\":\"123 anyplace\", \"name\":\"ABC\"}";

  Gson g = new Gson();
  Type mapType = new TypeToken<Map<String, Object>>(){}.getType();
  Map<String, Object> firstMap = g.fromJson(json1, mapType);
  Map<String, Object> secondMap = g.fromJson(json2, mapType);
  System.out.println(Maps.difference(firstMap, secondMap));
}

这个程序输出:

not equal: only on left={state=CA}: only on right={street=123 anyplace}

在此处详细了解生成的 MapDifference 对象包含哪些信息。

【讨论】:

  • 由于 Guava 是一个大库,如果你只是从中使用它,你可以将代码“提取”到你的项目中,这样你就不会超载 Dalvik 的 65K 方法限制 PS: 只需保留许可证标题以表明它是来自 Guava 项目的类/方法
  • @JoaoEvangelista Guava 适用于 Android。请参阅此 StackOverflow 问题:Is it a good idea to use Google Guava library for Android development?
  • 天啊。所有这些博客...为什么我没有早点找到它,无论如何感谢您的链接。在此链接中还发现了一个指向 Compatibility Docs for Android on Guava 的链接,其中提到了 ProGuard 的使用。
  • 感谢您的回答。你能澄清一下地图是什么:System.out.println(Maps.difference(firstMap, secondMap));
  • 这不只适用于 Json 对象只有原语的情况吗?它似乎不适用于更多的嵌套结构。
猜你喜欢
  • 1970-01-01
  • 2013-04-12
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多