我試圖做一個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.speedxml.jackson.databind.SerializationFeature
import com.speedxml.jackson.databind.MapperFeature
import javax.json.Json
import com.speedxml.jackson.databind.ObjectMapper
String template = ""/span>"
{"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 :
$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()
```
uj5u.com熱心網友回復:
我嘗試了另一個解決方案,即通過一個遞回函式對JsonSlurper()物件進行排序。 但這是一個復雜的物件,似乎由LinkedHashMap、ArrayList、LazyMap......組成,因此很難使其作業。
有人知道如何輕松地進行排序嗎?
這是我的代碼,試試......
def sortSubMap(def root, String keyToSort) {
root.each {
KeywordUtil.logInfo(") inspect:" it.expect())
KeywordUtil.logInfo("it" it.getClass())
KeywordUtil.logInfo("it.value" it.value.getClass())
if (it.key==keyToSort) {
KeywordUtil.logInfo("*** it.key==keyToSort"/span>)
//TODO :讓我們對這個節點的元素 "keyToSort "進行排序,并替換到json_obj中。
} else if ( it.value instanceof groovy.json.internal.LazyMap) {
KeywordUtil.logInfo("on recurse LazyMap"/span>)
it.each { it1 -> sortSubMap(it1, keyToSort) }
sortSubMap(it.value, keyToSort)
} else if (it.value instanceof ArrayList) {
KeywordUtil.logInfo("on recurse ArrayList"/span>)
KeywordUtil.logInfo("it.value : "/span> 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.expect())
sortSubMap(json_obj,"additional_data_value_list"); println(json_obj.inspection())
uj5u.com熱心網友回復:
作為參考,我終于成功地將我的 "extra_data_value_list "按 "extra_data_item_code "的值按字母順序排序
。這里是用這些奇怪的封閉函式產生的遞回函式:) :
span class="hljs-keyword">import test.common.JsonDiff
import com.speedxml.jackson.databind.SerializationFeature
import com.speedxml.jackson.databind.MapperFeature
import javax.json.Json
import com.speedxml.jackson.databind.ObjectMapper
import org.apache.commons.lang3.builder.ToStringBuilder
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
import groovy.json.JsonBuilder
//span>靈感來自https://stackoverflow.com/questions/39973481/recursively-removing-whitespace-from-json-field-names-in-groovy。
def jsonString = ""/span>"
{"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 = ""
{
"腿骨" : false,
"連接到" : {
"臂骨" : [
{
"fizz" : "buzz" 。
"well hello" : "there"
}
]
}
}
"""
def sortNodesInTree(def tree, String nodeName ) {
println "tree1 : "/span> tree
//println "tree1.key : " tree.key
switch (tree) {
case Map:
return tree.collectEntries { k, v ->
println "k v : $k $v"/span>
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 : "/span> tree
return tree.collection { e -> sortNodesInTree(e,nodeName) }
default :
return 樹。
}
}
def tree = new JsonSlurper() .parseText(jsonString)
def fixedTree = sortNodesInTree(tree,"additional_data_value_list")
println new JsonBuilder(fixedTree).toString()
console :
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":
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/334299.html
標籤:
