programing

JSON 개체의 델타 인코딩

easyjava 2023. 4. 4. 23:19
반응형

JSON 개체의 델타 인코딩

JSON 문서를 계산하고 적용하기 위한 표준 라이브러리 또는 도구가 있습니까?기본적으로 네트워크상에서 동기화된 상태로 유지하고 싶은 대량의 문서가 있습니다.또, 동기화할 때마다(이러한 변수의 대부분은 변경되지 않기 때문에) 그 문서 전체의 상태를 재발송하는 것은 피하고 싶습니다.즉, 오브젝트 전체를 재발송하지 않고 변경된 필드만을 송신합니다.다음과 같은 방법이 있으면 편리하다고 생각합니다.

//Start with two distinct objects on the server
// prev represents a copy of the state of the object on the client
// next represents a copy of the state of the object on the server
//
//1. Compute a patch
patch = computePatch(prev, next);

//2. Send patch over the network

//3. Apply the patch on the client
applyPatch(prev, patch);

//Final invariant:
//   prev represents an equivalent object to JSON.parse(JSON.stringify(next))

물론 저도 구현할 수 있지만 고려해야 할 몇 가지 가장 중요한 경우가 있습니다.다음은 다음과 같은 간단한 방법(다소 불만족스럽지만)입니다.

  1. 내 JSON 패처를 굴려봐점근적으로 이것은 아마도 JSON 문서의 모든 관련 기능을 지원할 수 있을 뿐만 아니라 (상대 부호화/편집 거리를 사용하여) int, double 및 string을 확산시키는 몇 가지 특수한 방법을 지원할 수 있기 때문에 최선의 방법일 것입니다.다만, JSON은 특별한 케이스가 많기 때문에, 많은 테스트를 실시하지 않고, 이 문제를 해결할 수 있는 것을 찾고 싶다고 생각하고 있기 때문에, JSON의 패치 적용의 오류로 인해 네트워크 Heisenbugs가 표시되는 것을 걱정할 필요는 없습니다.

  2. 동적 프로그래밍을 사용하여 JSON 문자열 간의 편집 거리를 직접 계산합니다.유감스럽게도 클라이언트와 서버의 JSON 구현이 다르면(즉, 필드의 순서가 다를 수 있음), 2차 시간 연산으로 인해 비용이 많이 듭니다.

  3. 프로토콜 버퍼를 사용합니다.프로토콜 버퍼는 내가 원하는 것을 정확히 수행하는 내장된 diff 메서드를 가지고 있으며, 그것들은 바이너리 직렬화 가능한 네트워크 친화적인 포맷입니다.유감스럽게도 이 파일들은 엄밀하게 입력되어 있기 때문에 필드를 동적으로 추가하거나 삭제할 수 있는 기능 등 JSON을 사용하는 많은 장점이 없습니다.현재 이 방법을 사용하고 있지만, 각 오브젝트를 지속적으로 업데이트해야 하기 때문에 향후 유지보수가 매우 어려워질 수 있습니다.

  4. 오브젝트 타입별로 커스텀프로토콜을 작성하는 등 매우 귀찮은 작업을 실시해, 양쪽 모두에서 올바르게 처리되기를 바란다(예!).

물론 제가 정말로 원하는 것은 여기 스택오버플로우에서 누군가가 와서 운영 환경과 여러 브라우저에서 잘 테스트된 공간 효율적인 javascript 객체의 차이점/패셔에 대한 참조를 하는 것입니다.

*갱신*

나는 나만의 패처를 쓰기 시작했다.그 초기 버전은 여기 github에서 구할 수 있다.

https://github.com/mikolalysenko/patcher.js

별로 없는 것 같기 때문에 JSON 패처를 위한 흥미로운 테스트 케이스 목록을 대신 받아 들일 생각입니다.

github에서 json diff & patch 라이브러리를 사용하고 있습니다(네, 파렴치한 플러그).

https://github.com/benjamine/JsonDiffPatch

Neil Fraser의 diff_match_patch lib를 사용하여 긴 문자열을 자동으로 처리합니다.브라우저와 서버 모두에서 동작합니다(양쪽 환경에서 실행되는 유닛테스트).(전체 기능 목록은 프로젝트 페이지에 있습니다.)

필요한 것은 특정 오브젝트에 대해 커스텀 diff/patch 함수를 삽입하는 옵션뿐입니다.다만, 추가는 어렵지 않습니다.포크를 실시해, 풀 요구를 송신하는 것이 좋습니다.

안부 전해요,

JSON 패치의 표준이 갱신되었습니다.

https://datatracker.ietf.org/doc/html/draft-ietf-appsawg-json-patch-10

패치 적용 및 패치 생성을 위한 구현은 https://github.com/Starcounter-Jack/Fast-JSON-Patch에서 확인할 수 있습니다.

저는 json-patch의 구현을 찾다가 이 질문을 하게 되었습니다.자신의 것을 롤하는 경우는, 이 드래프트에 근거하는 것이 좋을지도 모릅니다.

https://datatracker.ietf.org/doc/html/draft-pbryan-json-patch-00

표준적인 방법JSON 패치를 사용합니다.

JSON 패치는 JSON 문서의 변경 내용을 설명하는 형식입니다.부품만 변경되었을 때 전체 문서가 전송되지 않도록 하는 데 사용할 수 있습니다.HTTP PATCH 메서드와 조합하여 사용하면 표준 준거 방식으로 HTTP API를 부분적으로 업데이트할 수 있습니다.

패치 문서 자체는 JSON 문서입니다.

JSON 패치는 IETF의 RFC 6902에 규정되어 있습니다.

라이브러리는 대부분의 플랫폼과 프로그래밍 언어에 대해 존재합니다.

작성 시 Javascript, Python, PHP, Ruby, Perl, C, Java, C#, Go, Haskell, Erlang이 지원됩니다(여기서 전체 목록라이브러리).

javascript 목록입니다.

  • Fast-JSON-Diff 및 패치 모두 패치 적용, NPM에서 매주 509,361건 다운로드
  • jiff diff와 패치, 매주 npm에 5,075건 다운로드
  • jsonpatch-downloads는 패치만 적용되며 매주 2,014건의 다운로드가 npm에 있습니다.
  • jsonpatch.downloads는 패치만 적용되며, 매주 다운로드 수는 npm에 1,420회입니다.
  • JSON8 패치 적용(다양한 패치 적용), 매주 npm에 400건 다운로드

지금까지, 저 자신을 포함한 모든 사람이 Fast-JSON-Patch 라이브러리를 사용하고 있습니다.NodeJS 및 브라우저에서 동작합니다.

언급URL : https://stackoverflow.com/questions/7326532/delta-encoding-for-json-objects

반응형