谷歌差异匹配补丁:如何取消获取原始字符串?

时间:2016-06-29 12:26:34

标签: google-diff-match-patch

我使用Google diff-match-patch JAVA插件在两个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来使用此originalString重新创建latestString

我谷歌关于这一点,并发现这句老话评论@ Google diff-match-patch Wiki说,

  

只需循环遍历差异,交换即可完成取消修补   使用DIFF_DELETE DIFF_INSERT,然后应用补丁。

但我没有找到任何有用的代码来证明这一点。我怎么能用现有代码实现这一目标?任何指针或代码参考将不胜感激。

编辑:

我面临的问题是,在前端我正在显示一个修订模块,显示特定片段的所有事务(例如员工详细信息),比如哪个用户更新了详细信息等等。现在我我通过反向应用每个补丁来获取当前事务数据并将其显示为表(使用http://marianoguerra.github.io/json.human.js/)来重新创建片段JSON。但是一些JSON数据不是有效的JSON,我收到JSON.parse错误。

1 个答案:

答案 0 :(得分: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方法返回的数组中的第二个对象来检查补丁是否成功。这是一个布尔值数组,如果补丁正常工作,所有布尔值都应为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;
}
相关问题