45678910 Ответов: 2

Как обнаружить различия между двумя строками json в node.js


У меня есть две строки Json , которые могут иметь разные значения в какой-то момент времени, и я хочу знать, можно ли сравнить их с помощью JS?

например,
У меня есть эти две строки Json
//First Json
var Json1 = {"Name":"ABC";"Work":"Programmer";State:"123"};

//Second Json
var Json2 = {"Name":"XYZ";"Work":"Engineer";State:"456"};
Здесь я хочу получить результат, как показано ниже:
Name value changed from 'ABC' to 'XYZ'
Work value changed from 'Programmer' to 'Engineer'
State value changed from '123' to '456'


Что я уже пробовал:

Не в состоянии найти решение. Не могли бы вы мне помочь?

Richard MacCutchan

Очевидным способом было бы разобрать каждую строку на объект, а затем сравнить поля.

2 Ответов

Рейтинг:
2

Thomas Daniels

Во-первых, то, что у вас есть, не является допустимым JSON. Вы используете точку с запятой вместо запятой. Кроме того, в строке JSON все ключи должны быть заключены в кавычки (чего нет в вашем примере).

Ваш первый шаг кода будет заключаться в преобразовании строки JSON в объект, используя JSON.parse Затем вы можете использовать Object.keys чтобы получить все ключи от первого объекта, и вы можете перебирать эти ключи, чтобы увидеть разницу в значениях в двух объектах.

var jsonString1 = '{"Name":"ABC","Work":"Programmer","State":"123"}';
var jsonString2 = '{"Name":"XYZ","Work":"Engineer","State":"456"}';

var jsonObject1 = JSON.parse(jsonString1);
var jsonObject2 = JSON.parse(jsonString2);

var keys = Object.keys(jsonObject1);
for (var i = 0; i < keys.length; i++) {
  var key = keys[i];
  if (jsonObject1[key] != jsonObject2[key]) {
    console.log(key + " value changed from '" + jsonObject1[key] + "' to '" + jsonObject2[key] + "'");
  }
}


45678910

Спасибо за быстрый взгляд.
Но я получаю нижеприведенный результат. Не то, что я ожидаю.

9 значение изменено с "а" на "Х"
10 значение изменилось с 'B' на 'Y'
11 значение изменено с 'C' на 'Z'
....
....

Не могли бы вы мне помочь?

Thomas Daniels

Для меня это сработало. Вы хотите поделиться ваш текущий код в JSFiddle чтобы я мог это проверить?

45678910

Привет,
Простите что с опозданием ответ. Это сработало и для меня. Я сделал небольшую ошибку. После того, как я исправил его, он работает нормально. Большое спасибо за вашу помощь.

Рейтинг:
1

Member 14665733

// Вы можете использовать циклы, чтобы получить результат именно так, как вы хотите

const Json1 = {Name: 'ABC', Work: 'Programmer', State: '123'};
const Json2 = {Name: 'XYZ', Work: 'Engineer', State: '456'};

const obj1Keys = Object.keys(Json1);
const obj1Values = Object.values(Json1);
const obj2Keys = Object.keys(Json2);
const obj2Values = Object.values(Json2);

for ( let i = 0; i < obj1Keys.length; i++ ) {
  for ( let j = 0; j < obj2Keys.length; j++ ) {

    if ( obj1Keys[i] === obj2Keys[j]) {
      if ( obj1Values[i] !== obj2Values[j]) {
          console.log( `${obj1Keys[i]} value changed from
                           '${obj1Values[i]}' to '${obj2Values[j]}'`);
      }
    }
  }
}


Richard Deeming

Это то же самое, что и решение 1. Вы ничего не добавили к обсуждению. А копируя чужой ответ, Вы выглядите как плагиатор.

Member 14665733

Мистер Ричард
Может быть, вы зубрежка !
Можете ли вы видеть, что первое решение не дает точно того ответа, который ожидается в описании вопроса.
А также первое решение не следует текущей версии js или ts lint.
Если добавление чего-то для обсуждения создает некоторую путаницу, то ничто для обсуждения не лучше, чем добавление чего-то для обсуждения.
если 2 + 2 = 4, то всегда 2 + 2 = 4.
Я не плагиатор, но ты выглядишь как слепой с идеальными глазами.

Richard Deeming

Это может быть не совсем тот же код, но это фактически одно и то же предложение - использование Object.keys чтобы получить ключи, пройдите по списку и сравните значения.

Я никогда не говорил, что ты плагиатор. Я просто хотел сказать, что вы ничего не добавили к нашей дискуссии.