【问题标题】:How to determine if JSON data-content is identical? (Computing JSON Hash?) [duplicate]如何确定 JSON 数据内容是否相同? (计算 JSON 哈希?)[重复]
【发布时间】:2017-10-01 21:47:41
【问题描述】:

如果我有两个 JSON 文件/表达式,我如何确定 JSON 的 data-content 在功能上是否等效?

即比较应该忽略语法,如:

  • 所有空格/换行符(字符串之外)。
  • 对象成员的排序。
  • 等效的 unicode 字符(例如 \u0041 = A)。

我知道需要某种 JSON 解析器,但我不知道我的选择。我的数据在 SQL 服务器上,所以我有直接可用的 SQL JSON 函数和 SSIS 脚本组件 (C#/.Net)。

或者:有没有办法计算 JSON data-content 的哈希值,是否有任何标准可以在计算哈希之前最小化/唯一化 JSON 表达式。

编辑:JSON 架构未知且未修复。

【问题讨论】:

  • 反序列化和比较?
  • 也可以考虑在 SQL 端进行。
  • @Plutonix 你能提供一个最小的例子吗?它需要类定义吗?
  • @MichałŻołnieruk 如何在 SQL 上做到这一点? (我是 SQL 专家,但对此一无所知。)
  • @MartinThøgersen - 在这种情况下,我认为 json.netJTokenEqualityComparer 应该可以满足您的需求。

标签: c# .net sql-server json ssis


【解决方案1】:

根据 cmets 中的反馈,这是我基于 JTokenEqualityComparer 的最终工作示例。 该方法将通过使用 SSIS 脚本任务或 SQL CLR 应用于 SQL 服务器。

using System;
using Newtonsoft.Json.Linq;

namespace JSON_Comparison_Test
{
    class Program
    {
        static void Main(string[] args)
        {

            String jsonString1 = "{\"key1\":\"ABC\",\"key2\":\"DEF\"}";
            String jsonString2 = "{ \"key2\":\"DEF\" , \r\n \t  \"key1\" : \"\u0041BC\" }";

            var obj1 = JToken.Parse(jsonString1);
            var obj2 = JToken.Parse(jsonString2);

            var comparer = new JTokenEqualityComparer();
            var hashCode1 = comparer.GetHashCode(obj1);
            var hashCode2 = comparer.GetHashCode(obj2);

            Console.WriteLine(hashCode1.ToString()); // -323033486
            Console.WriteLine(hashCode2.ToString()); // -323033486

            Console.WriteLine(comparer.Equals(obj1, obj2)); // True
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2014-06-03
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多