我正在使用 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 差异匹配补丁 Wiki https://code.google.com/p/google-diff-match-patch/wiki/API saying,
只需循环比较差异、交换即可完成取消修补
DIFF_INSERT 和 DIFF_DELETE,然后应用补丁。
但我没有找到任何有用的代码来证明这一点。我怎样才能用现有的代码实现这一目标?任何指针或代码参考将不胜感激。
Edit:
我面临的问题是,在前端我显示一个修订模块,该模块显示特定片段的所有交易(例如员工详细信息),例如哪个用户更新了哪些详细信息等。现在我正在重新创建通过反向应用每个补丁来获取当前交易数据并将其显示为表格(使用http://marianoguerra.github.io/json. human.js/ http://marianoguerra.github.io/json.human.js/)。但有些 JSON 数据不是有效的 JSON,我收到 JSON.parse 错误。
我想做一些类似的事情(在 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)