Можно ли регистрировать отдельные изменения в Json.NET Merge? - PullRequest
0 голосов
/ 02 января 2019

Есть ли способ идентифицировать изменения, которые были сделаны в Слиянии?Например, вот два файла JSON: test1.json

{
  f1: "String",
  f2: true,
  f3: 1000001,
  f4: [1]
}

.and test2.json

{
  f1: "String",
  f2: 1,
  f3: 1000002,
  f4: [1,2]
}

В первом f2 - логическое значение, но во втором f2 это число.Аналогично, значение f3 изменяется, и к f4 добавляется дополнительный элемент.

Есть ли способ записать эти изменения?Меня больше всего интересует изменение типа данных, а не изменение содержимого.

1 Ответ

0 голосов
/ 02 января 2019

Вы можете прочитать оба файла JSON, десериализовать их оба в Dictionary<string,object>, затем сравнить их с String.Equals() и вывести различия.

Приведенная ниже демонстрация предполагает одноуровневую структуру JSON, как показано в вопросе.Та же логика должна применяться для глубоко вложенных объектов JSON, но способ, которым вы пересекаете объекты JSON и ключи соответствия, изменится.Для более глубоких слоистых объектов JSON с различной глубиной потребуется рекурсивный обход.

Базовая демонстрация:

using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace MergeJson {
    public static class Program {
        private static string FILE_ONE = "test1.json";
        private static string FILE_TWO = "test2.json";

        /// <summary>
        /// Converts JSON file into Dictionary
        /// </summary>
        /// <param name="path">The path of the JSON file</param>
        /// <returns>The converted Dictionary</returns>
        private static Dictionary<string, object> GetJsonDict (string path) {

            // Read json file into string
            string json = File.ReadAllText (path);

            // Deserialize JSON string into dictionary
            var jsonDict = JsonConvert.DeserializeObject<Dictionary<string, object>> (json);

            return jsonDict;
        }

        public static void Main (string[] args) {

            // Get both Dictionaries
            var jsonDictOne = GetJsonDict (FILE_ONE);
            var jsonDictTwo = GetJsonDict (FILE_TWO);

            // Go through each key in the first dictionary and compare with second dictionary
            foreach (KeyValuePair<string, object> entry in jsonDictOne) {

                // Get key and value
                var value = entry.Value;
                var key = entry.Key;

                // Ensure second dictionary has key
                if (jsonDictTwo.ContainsKey (key)) {
                    var otherValue = jsonDictTwo[key];

                    // Compare both values and output differences
                    if (!value.Equals (otherValue)) {
                        FormattableString difference = $"Difference in key {entry.Key}: {value} -> {otherValue}";
                        Console.WriteLine (difference);
                    }
                }
            }
        }
    }
}

Выход:

Difference in key f2: True -> 1
Difference in key f3: 1000001 -> 1000002
Difference in key f4: [
  1
] -> [
  1,
  2
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...