java - 如何按值对 json 进行排序以查看真实的 DIFF
问题描述
我尝试制作一个不查看我的 JSON 值顺序的 DIFF。我尝试在使用 import com.fasterxml.jackson.databind.ObjectMapper 区分它之前对我的 json 进行排序,但 SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS 或 MapperFeature.SORT_PROPERTIES_ALPHABETICALLY 都没有按照我的意愿对其进行排序。有人知道另一种按字母值(NB_SUP_HET、NB_SUP_SOL、WEI_MAX)对我的 json 进行排序的方法吗?
import test.common.JsonDiff
import com.fasterxml.jackson.databind.SerializationFeature
import com.fasterxml.jackson.databind.MapperFeature
import javax.json.Json
import com.fasterxml.jackson.databind.ObjectMapper
String template = """
{"preparation_order_list" : [ {
"net_weight_to_prepare" : 12.33,
"additional_data_value_list" : [ {
"additional_data_item_code" : "NB_SUP_HET",
"additional_data_item_value" : "001821"
}, {
"additional_data_item_code" : "NB_SUP_SOL",
"additional_data_item_value" : "002000"
}, {
"additional_data_item_code" : "WEI_MAX",
"additional_data_item_value" : "000007358"
} ]
}]}
"""
String file_to_compare = """
{"preparation_order_list" : [ {
"net_weight_to_prepare" : 12.33,
"additional_data_value_list" : [ {
"additional_data_item_code" : "WEI_MAX",
"additional_data_item_value" : "000007358"
}, {
"additional_data_item_code" : "NB_SUP_SOL",
"additional_data_item_value" : "002000"
}, {
"additional_data_item_code" : "NB_SUP_HET",
"additional_data_item_value" : "001821"
} ]
}]}
"""
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true)
String prettyApiJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(mapper.readTree(file_to_compare));
String prettyTemplateJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(mapper.readTree(template));
println "------------------------------------------"
println "prettyApiJson :\n$prettyApiJson"
String diff_string = test.common.JsonDiff.GetJsonDiff(prettyApiJson,prettyTemplateJson)
JsonStructure jsonStructInput = Json.createReader(new StringReader(prettyApiJson)).read()
JsonStructure jsonStructTemplate = Json.createReader(new StringReader(prettyTemplateJson)).read()
JsonPatch diff = Json.createDiff(jsonStructTemplate, jsonStructInput)
println diff.toString()
```
解决方案
有关信息,我终于成功地按字母顺序按“additional_data_item_code”值对“additional_data_value_list”进行了排序
这是带有这些奇怪的闭包函数的递归函数:):
import test.common.JsonDiff
import com.fasterxml.jackson.databind.SerializationFeature
import com.fasterxml.jackson.databind.MapperFeature
import javax.json.Json
import com.fasterxml.jackson.databind.ObjectMapper
import org.apache.commons.lang3.builder.ToStringBuilder
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
import groovy.json.JsonBuilder
// inspired from https://stackoverflow.com/questions/39973481/recursively-removing-whitespace-from-json-field-names-in-groovy
def jsonString = """
{"items" : [ {
"net_weight_to_prepare" : 12.33,
"additional_data_value_list" : [ {
"additional_data_item_code" : "WEI_MAX",
"additional_data_item_value" : "000007358"
}, {
"additional_data_item_code" : "NB_SUP_SOL",
"additional_data_item_value" : "002000"
}, {
"additional_data_item_code" : "NB_SUP_HET",
"additional_data_item_value" : "001821"
} ]
}]}
"""
def json = """
{
"leg bone" : false,
"connected to the" : {
"arm bones " : [
{
" fizz" : "buzz",
"well hello" : "there"
}
]
}
}
"""
def sortNodesInTree(def tree, String nodeName ) {
println "tree1 : "+tree
//println "tree1.key : "+tree.key
switch (tree) {
case Map:
return tree.collectEntries { k, v ->
println "k v : $k $v"
if (k==nodeName) {[(k):v.sort { a,b -> a.additional_data_item_code <=> b.additional_data_item_code}]}
else {
[(k):sortNodesInTree(v,nodeName)]
}
}
case Collection:
println "tree2 : "+tree
return tree.collect { e -> sortNodesInTree(e,nodeName) }
default :
return tree
}
}
def tree = new JsonSlurper().parseText(jsonString)
def fixedTree = sortNodesInTree(tree,"additional_data_value_list")
println new JsonBuilder(fixedTree).toString()
安慰 :
println(JsonBuilder(fixedTree).toString())
{"items":[{"net_weight_to_prepare":12.33,"additional_data_value_list":[{"additional_data_item_code":"NB_SUP_HET","additional_data_item_value":"001821"},{"additional_data_item_code":"NB_SUP_SOL","additional_data_item_value":"002000"},{"additional_data_item_code":"WEI_MAX","additional_data_item_value":"000007358"}]}]}
推荐阅读
- bash - 如何正确比较 Bash 中的变量和字符串?
- c - 套接字如何在C中接受多个连接
- sql-server - Docker 网络中的 SQL Server:在 $PATH 中找不到可执行文件“:未知
- docker - Docker COPY 失败,没有这样的文件或目录
- javascript - 如何为表单Javascript中的选择分配数值
- sql - 如何在 ASP.NET MVC5 中为特定模式执行自动增量
- batch-file - 如何使批处理文件对特定输入做出不同的回答?
- php - 关于准备好的语句和连接的建议
- javascript - Express 标头没有 cookie,具体取决于路径
- css - Oxygen XML 作者中的 XPath 和 CSS:如何在 oxy_xpath 中创建动态参数