programing

Java에서 두 JSON 파일을 비교하는 가장 좋은 방법

testmans 2023. 4. 5. 21:24
반응형

Java에서 두 JSON 파일을 비교하는 가장 좋은 방법

이 작업에 어떻게 접근할 것을 제안하십니까?

내가 보기에 난제는 다른 정보를 지능적으로 제시하는 것이다.휠을 재창조하기 전에 이러한 비교를 어떻게 처리해야 하는지에 대해 허용되는 접근 방식이 있습니까?

RFC 6902(JSON 패치)에 따라 diff 정보를 제공하는 zjsonpatch 라이브러리를 권장합니다.잭슨과 함께 사용할 수 있습니다.

JsonNode beforeNode = jacksonObjectMapper.readTree(beforeJsonString);
JsonNode afterNode = jacksonObjectMapper.readTree(afterJsonString);
JsonNode patch = JsonDiff.asJson(beforeNode, afterNode);
String diffs = patch.toString();

이 라이브러리는 어레이에서 삽입/삭제되는 항목을 검출할 수 있기 때문에 fge-json-patch(다른 답변에서 언급)보다 우수합니다.Fge-json-patch는 이를 처리할 수 없습니다(배열 중간에 아이템을 삽입하면 아이템과 그 이후의 모든 아이템이 1개씩 이동하기 때문에 변경된 것으로 간주됩니다).

json 문자열을 비교하는 가장 쉬운 방법은JSONCompareJSONAssert 라이브러리에서.장점은 구조에만 국한되지 않고 원하는 경우 값을 비교할 수 있다는 것입니다.

JSONCompareResult result = 
     JSONCompare.compareJSON(json1, json2, JSONCompareMode.STRICT);
System.out.println(result.toString());

다음과 같이 출력됩니다.

Expected: VALUE1
     got: VALUE2
 ; field1.field2

는 JSONAssert와 좋은 경험을 했습니다.

import org.junit.Test;
import org.apache.commons.io.FileUtils;
import org.skyscreamer.jsonassert.JSONAssert;
import org.skyscreamer.jsonassert.JSONCompareMode;

... 
@Test
public void myTest() {
  String expectedJson = FileUtils.readFileToString("/expectedFile");
  String actualJson = FileUtils.readFileToString("/actualFile");
  JSONAssert.assertEquals(expectedJson, actualJson, JSONCompareMode.STRICT);
}
... 

이것은 단지 평등만을 다루지 차이점을 다루지 않는다.


잭슨이랑.

ObjectMapper mapper = new ObjectMapper();

JsonNode tree1 = mapper.readTree(jsonInput1);
JsonNode tree2 = mapper.readTree(jsonInput2);

boolean areTheyEqual = tree1.equals(tree2);

JavaDoc for JsonNode.equals에서 다음을 수행합니다.

노드 객체의 동등성은 완전(심층) 값의 동등성으로 정의됩니다.즉, 루트 노드의 동일성을 비교하여 JSON 트리의 동일성을 비교할 수 있습니다.

XStream의 아키텍처와 JSON 매핑 처리를 시험해 볼 수 있습니다.

또, C#의 XMLDiff 를 사용해 2 개의 XML 파일을 비교하고, 3 개의 XML 파일을 생성한다」라고 하는 투고도 참조해 주세요.C#에 있는데 논리는 똑같아요.

저도 비슷한 문제가 있어서 결국 제 도서관을 쓰게 되었습니다.

https://github.com/algesten/jsondiff

분산 및 패칭이 모두 가능합니다.

Diff는 JSON 객체 자체이며 객체 Marge/Replace 및 배열 삽입/Replace 구문이 단순합니다.

예:

original
{
   a: { b: 42 }
}

patch
{
  "~a": { c: 43 }
}

~오브젝트의 마지를 나타냅니다.

result
{
   a: { b: 42, c: 43 }
}

json-lib의

json-lib을 사용하여 json 데이터를 해석합니다.이것에 의해, 통상의 Java 오브젝트가 됩니다.이러한 오브젝트는 동등한 메서드를 사용하여 비교할 수 있습니다.이는 json-lib에서 온 사람들이 동일한 방법을 적절하게 구현했다고 가정할 만 유효하지만 쉽게 테스트할 수 있습니다.

이미 잭슨을 이용하시는 분들은 json의 개재에 의한를 추천합니다.

final JsonNode patchNode = JsonDiff.asJson(firstNode, secondNode);
System.out.println("Diff=" + m.writeValueAsString(patchNode));

아래 종속성을 사용하여 Json을 STRICT, LENIENT, IGNORE_ORDER 등과 비교할 수 있습니다.

<dependency>
    <groupId>org.skyscreamer</groupId>
    <artifactId>jsonassert</artifactId>
    <version>1.5.0</version>
    <scope>test</scope>
</dependency>

  public static boolean isTwoJsonEquals(JSONObject firstObj,JSONObject secondObj, JSONCompareMode compareMode){
    try {
      JSONCompareResult result = JSONCompare.compareJSON(firstObj, secondObj, compareMode);

      return result.passed();
    } catch (JSONException e) {
      e.printStackTrace();
    }
    return false;
  }

두 JSON Ignore of elements/object를 비교하고 싶은 경우 이 라이브러리가 도움이 되는지 확인하십시오.

사용방법:

List<Diff> diff = new DnjsonDiff().getDiff(String left, String right)
Left =[{"name":"Bob","businessKey":"4444"},{"name":"John","businessKey":"5555"}]
Right = [{"name":"Bob","businessKey":"6666"},{"name":"John", "businessKey":"4444"}]

Diff:

[
    {
        "op": "replace",
        "configuredValue": "John",
        "intendedValue": "Bob",
        "businessKey": "4444"
    },
    {
        "op": "remove",
        "configuredValue": null,
        "intendedValue": "{\"name\":\"John\",\"businessKey\":\"5555\"}",
        "businessKey": "5555"
    },
    {
        "op": "add",
        "configuredValue": "{\"name\":\"Bob\",\"businessKey\":\"6666\"}",
        "intendedValue": null,
        "businessKey": "null"
    }
]

비교를 위해 Google의 Guava 라이브러리를 사용합니다.사용 방법에 대한 자세한 설명이 있는 이 답변을 확인하십시오.

https://stackoverflow.com/a/50969020/17762303

언급URL : https://stackoverflow.com/questions/6526911/best-way-to-compare-two-json-files-in-java

반응형