2013-03-23 25 views
6

Tôi có hai tệp json và tôi muốn lấy một json chứa các khác biệt. Điều quan trọng là rằng chỉ sự khác biệt thực sự của nội dung phải được hiển thị, bất kể thay đổi thứ tự của một số yếu tố.Cách tốt nhất để trả lại sự khác biệt của hai tệp json theo chương trình

Cách tốt nhất để làm điều đó là gì? Tôi đang tìm kiếm giải pháp hiệu quả nhất có thể, vì json s có thể chứa nhiều dữ liệu và người dùng cần công việc cần làm càng nhanh càng tốt.

Lưu ý: json s có thể chứa dữ liệu được mã hóa ở các độ sâu khác nhau. Bất kỳ ngôn ngữ lập trình nào là ok, nhưng tôi thích một câu trả lời có thể dễ dàng được thực hiện trong php.

+0

Không có vấn đề làm thế nào bạn nhìn vào nó, tôi tin rằng bạn chỉ cần đi qua tất cả các phím duy nhất. Trừ khi bạn có thể dựa vào một số loại định danh nhưng đối với điều đó bạn sẽ cần phải xây dựng thêm – Alexander

+1

Tôi trả lời một câu hỏi tương tự ở đây: "[Mảng đa chiều, kiểm tra sự khác biệt] [1]". Câu trả lời có thể được sửa đổi để hạ xuống các nhánh, nếu cần thiết bằng cách gọi đệ quy các phương thức "get_keys" và "compare_records". [1]: http://stackoverflow.com/questions/15504734/multidimensional-arrays-check-difference/15504984#15504984 –

+0

@ JDPace xin lỗi, không thấy số –

Trả lời

4

Về cơ bản, những gì bạn muốn là một cái gì đó tương tự như array_diff_assoc, nhưng áp dụng cho đối tượng json, và đệ quy.

Các chức năng array_diff không đệ quy do các vấn đề tham chiếu: có thể chỉ định tham chiếu mảng cho mục nhập của mảng đó, làm cho mảng trở nên vô hạn. Tôi không nghĩ rằng có thể có được tình huống tương tự với một đối tượng json, do đó làm cho một hàm đệ quy an toàn.

Giả sử rằng bạn muốn tính toán sự khác biệt giữa đối tượng A và B, và có kết quả trong đối tượng C. Nguyên tắc là để lặp qua từng lĩnh vực của A (một foreach nên làm), và khi:

  • không có trường như vậy tồn tại trong B, sao chép nó qua C.
  • một lĩnh vực tương tự tồn tại trong B, đặt trong C là kết quả của sự khác biệt của A lĩnh vực với lĩnh vực B, mà là một cuộc gọi đệ quy vào chức năng khác với những trường như tham số, cũng như một đối tượng mới cho kết quả.

Thứ tự của A phải được tôn trọng.

+0

Tôi có nên sắp xếp 'json' không? –

+2

Không cần thiết. –

+1

@BujancaMihai, chú ý thuật toán này sẽ không xem xét các khóa chỉ xuất hiện trong B – Alexander

7

Hãy thử sử dụng chức năng array_diff

array_diff(json_decode($jsonData1), json_decode($jsonData2)); 
Các vấn đề liên quan