2016-07-08 13 views
5

Tôi muốn phân biệt hai tệp văn bản JSON. Thật không may họ đang xây dựng theo thứ tự tùy ý, vì vậy tôi nhận được diffs khi họ đang giống hệt về mặt ngữ nghĩa. Tôi muốn sử dụng jq (hoặc bất cứ điều gì) để sắp xếp chúng trong bất kỳ loại lệnh đầy đủ nào, để loại bỏ sự khác biệt chỉ do đặt hàng phần tử.Làm thế nào tôi có thể sắp xếp hoàn toàn JSON tùy ý bằng cách sử dụng jq?

- phím tắt giải quyết một nửa vấn đề nhưng không phân loại mảng.

Tôi khá là không biết gì về jq và không biết cách viết bộ lọc đệ quy jq để bảo toàn tất cả dữ liệu; Bất kỳ trợ giúp sẽ được đánh giá cao.

Tôi nhận ra rằng đầu ra 'khác biệt' không nhất thiết là cách tốt nhất để so sánh hai đối tượng phức tạp, nhưng trong trường hợp này tôi biết hai tệp này rất giống nhau (gần như giống hệt) và dòng-by- sự khác biệt về đường dây là tốt cho mục đích của tôi.

Using jq or alternative command line tools to diff JSON files trả lời một câu hỏi rất giống nhau, nhưng không in sự khác biệt. Ngoài ra, tôi muốn lưu các kết quả được sắp xếp, vì vậy những gì tôi thực sự muốn chỉ là một chương trình lọc để sắp xếp JSON.

+2

có thể trùng lặp của [Sử dụng JQ hoặc các công cụ dòng lệnh thay thế cho file JSON diff] (http://stackoverflow.com/questions/31930041/using-jq-or-alternative-command- line-tools-to-diff-json-files) –

Trả lời

5

Dưới đây là giải pháp sử dụng hàm chung selected_walk/1 (được đặt tên theo lý do được mô tả trong bản ghi bên dưới).

normalize.jq:

# Apply f to composite entities recursively using keys[], and to atoms 
def sorted_walk(f): 
    . as $in 
    | if type == "object" then 
     reduce keys[] as $key 
     ({}; . + { ($key): ($in[$key] | sorted_walk(f)) }) | f 
    elif type == "array" then map(sorted_walk(f)) | f 
    else f 
    end; 

def normalize: sorted_walk(if type == "array" then sort else . end); 

normalize 

Ví dụ sử dụng bash:

diff <(jq -S -f normalize.jq FILE1) <(jq -S -f normalize.jq FILE2) 

PostScript: Định nghĩa được xây dựng trong các walk/1 đã được sửa đổi sau khi phản ứng này lần đầu tiên được đăng tải: nó bây giờ sử dụng keys_unsorted thay vì keys.

+0

Chỉ cần những gì tôi cần, cảm ơn! Tôi thấy bạn đã đăng một biến thể của giải pháp này trong bài đăng có liên quan, nhưng ví dụ đơn giản ở đây đã trả lời một số câu hỏi. –

3

Tôi muốn phân biệt hai tệp văn bản JSON.

Sử dụng jd với -set tùy chọn:

Không đầu ra có nghĩa là có sự khác biệt.

$ jd -set A.json B.json 

Sự khác biệt được hiển thị dưới dạng đường dẫn @ và + hoặc -.

$ jd -set A.json C.json 

@ ["People",{}] 
+ "Carla" 

Khác biệt đầu ra cũng có thể được sử dụng làm tệp vá với tùy chọn -p.

$ jd -set -o patch A.json C.json; jd -set -p patch B.json 

{"City":"Boston","People":["John","Carla","Bryan"],"State":"MA"} 

https://github.com/josephburnett/jd#command-line-usage

Các vấn đề liên quan