2

Google diff-match-patch JAVA プラグインを使用して 2 つの JSON 文字列間のパッチを作成し、そのパッチをデータベースに保存しています。

diff_match_patch dmp = new diff_match_patch();    
LinkedList<Patch> diffs = dmp.patch_make(latestString, originalString);
String patch = dmp.patch_toText(diffs); // Store patch to DB

これを使用して を渡すことpatchで を再作成する方法はありますか?originalStringlatestString

私はこれについてグーグルで検索し、この非常に古いコメント @ Google diff-match-patch Wikiを見つけました。

パッチを解除するには、差分をループし、DIFF_INSERT を DIFF_DELETE に交換してから、パッチを適用します。

しかし、これを示す有用なコードは見つかりませんでした。既存のコードでこれを達成するにはどうすればよいですか? ポインタまたはコード参照をいただければ幸いです。

編集:

私が直面している問題は、フロントエンドで、特定のフラグメント (従業員の詳細など) のすべてのトランザクションを表示するリビジョン モジュールを表示していることです。たとえば、どのユーザーがどの詳細を更新したかなどです。各パッチを逆に適用して JSON をフラグメント化し、現在のトランザクション データを取得してテーブルとして表示します ( http://marianoguerra.github.io/json.human.js/を使用)。しかし、一部の JSON データは有効な JSON ではなく、JSON.parse エラーが発生します。

4

1 に答える 1

0

私は(C#で)似たようなことをしようとしていましたが、比較的単純なオブジェクトで機能しているのはpatch_applyメソッドです。このユースケースはドキュメントに欠けているように見えるので、ここで回答します。コードは C# ですが、API はクロスランゲージです。

static void Main(string[] args)
{
    var dmp = new diff_match_patch();

    string v1 = "My Json Object;            
    string v2 = "My Mutated Json Object"

    var v2ToV1Patch = dmp.patch_make(v2, v1);
    var v2ToV1PatchText = dmp.patch_toText(v2ToV1Patch);  // Persist text to db

    string v3 = "Latest version of JSON object;

    var v3ToV2Patch = dmp.patch_make(v3, v2);
    var v3ToV2PatchTxt = dmp.patch_toText(v3ToV2Patch);  // Persist text to db

    // Time to re-hydrate the objects 

    var altV3ToV2Patch = dmp.patch_fromText(v3ToV2PatchTxt);
    var altV2 = dmp.patch_apply(altV3ToV2Patch, v3)[0].ToString(); // .get(0) in Java I think           

    var altV2ToV1Patch = dmp.patch_fromText(v2ToV1PatchText);
    var altV1 = dmp.patch_apply(altV2ToV1Patch, altV2)[0].ToString(); 

}

これを、以前は JSON オブジェクト全体が保存されていた監査ログとして改造しようとしています。監査対象のオブジェクトがより複雑になるにつれて、ストレージ要件が劇的に増加しています。複雑な大きなオブジェクトにはまだこれを適用していませんが、patch_applyメソッドによって返された配列の 2 番目のオブジェクトを確認することで、パッチが成功したかどうかを確認できます。これはブール値の配列で、パッチが正しく機能した場合はすべて true になります。これを確認するためのコードを書くことができます。これは、単に解析エラーが発生するのではなく、JSON からオブジェクトを正常に再水和できるかどうかを確認するのに役立ちます。私のプロトタイプ C# メソッドは次のようになります。

private static bool ValidatePatch(object[] patchResult, out string patchedString)
{
    patchedString = patchResult[0] as string;

    var successArray = patchResult[1] as bool[];

    foreach (var b in successArray)
    {
        if (!b)
            return false;
    }

    return true;
}
于 2018-06-15T11:19:33.487 に答える