如何按值排序json以便看到真正的DIFF



我尝试制作一个不查看JSON值顺序的DIFF。我试图排序我的json与导入com.fasterxml.jackson.databind之前。ObjectMapper,但都不是SerializationFeature。ORDER_MAP_ENTRIES_BY_KEYS或MapperFeature。sort_properties_按字母顺序排序。有人知道另一种方法排序我的json按字母顺序值(NB_SUP_HET, NB_SUP_SOL, WEI_MAX) ?

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()
```

我尝试了另一个解决方案,即通过递归函数对JsonSlurper()对象进行排序。但是很难使它工作,因为这是一个复杂的对象,似乎由LinkedHashMap, ArrayList, LazyMap,…

有人知道怎么方便地排序吗?

这是我的代码尝试…

def sortSubMap(def root, String keyToSort) {
root.each {
KeywordUtil.logInfo(") inspect:"+it.inspect())
KeywordUtil.logInfo("it " + it.getClass())
KeywordUtil.logInfo("it.value " + it.value.getClass())
if (it.key==keyToSort) {
KeywordUtil.logInfo("*** it.key==keyToSort")
//TODO :let's sort elements of this node "keyToSort" and replace in json_obj 

} else if ( it.value instanceof groovy.json.internal.LazyMap) {
KeywordUtil.logInfo("on recurse LazyMap")
it.each { it1 -> sortSubMap(it1, keyToSort) }
sortSubMap(it.value, keyToSort)
} else if (it.value instanceof ArrayList) {
KeywordUtil.logInfo("on recurse ArrayList")
KeywordUtil.logInfo("it.value : " + it.value)
sortSubMap(it.value, keyToSort)
}
}
}

def json_input = """
{"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_obj = new groovy.json.JsonSlurper().parseText(json_input)
println(json_obj.inspect())
sortSubMap(json_obj,"additional_data_value_list"); println(json_obj.inspect())

作为参考,我终于成功地排序了我的" additional_data_value_list ";通过"additional_data_item_code"值按字母顺序

这是用这些奇怪的闭包函数生成的递归函数:):

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"}]}]}

最新更新