比较Scala中的json相等性
如果scala中的两个json结构相同,如何比较 例如,如果我有:比较Scala中的json相等性,json,scala,equals,equality,Json,Scala,Equals,Equality,如果scala中的两个json结构相同,如何比较 例如,如果我有: { resultCount: 1, results: [ { artistId: 331764459, collectionId: 780609005 } ] } 及 它们应该被认为是相等的,如果json库编写正确的话,您应该能够简单地执行json1==json2。这对你不管用吗 这就是,尽管我希望每个json库都是这样: import spray.json._ import
{
resultCount: 1,
results: [
{
artistId: 331764459,
collectionId: 780609005
}
]
}
及
它们应该被认为是相等的,如果json库编写正确的话,您应该能够简单地执行json1==json2。这对你不管用吗
这就是,尽管我希望每个json库都是这样:
import spray.json._
import DefaultJsonProtocol._
Welcome to Scala version 2.10.4 (OpenJDK 64-Bit Server VM, Java 1.7.0_51).
Type in expressions to have them evaluated.
Type :help for more information.
scala> val json1 = """{ "a": 1, "b": [ { "c":2, "d":3 } ] }""".parseJson
json1: spray.json.JsValue = {"a":1,"b":[{"c":2,"d":3}]}
scala> val json2 = """{ "b": [ { "d":3, "c":2 } ], "a": 1 }""".parseJson
json2: spray.json.JsValue = {"b":[{"d":3,"c":2}],"a":1}
scala> json1 == json2
res1: Boolean = true
Spray json使用不可变的scala
Map
来表示解析产生的抽象语法树中的json对象,因此只有Map
的相等语义才起作用。调用方法comparejson(str1,str2)
将返回一个布尔值。
请确保这两个字符串参数是json。
欢迎使用和测试
def compare_2Json(js1:String,js2:String): Boolean = {
var js_str1 = js1
var js_str2 = js2
js_str1=js_str1.replaceAll(" ","")
js_str2=js_str2.replaceAll(" ","")
var issame = false
val arrbuff1 = ArrayBuffer[String]()
val arrbuff2 = ArrayBuffer[String]()
if(js_str1.substring(0,1)=="{" && js_str2.substring(0,1)=="{" || js_str1.substring(0,1)=="["&&js_str2.substring(0,1)=="["){
for(small_js1 <- split_JsonintoSmall(js_str1);small_js2 <- split_JsonintoSmall((js_str2))) {
issame = compare_2Json(small_js1,small_js2)
if(issame == true){
js_str1 = js_str1.substring(0,js_str1.indexOf(small_js1))+js_str1.substring(js_str1.indexOf(small_js1)+small_js1.length)
js_str2 = js_str2.substring(0,js_str2.indexOf(small_js2))+js_str2.substring(js_str2.indexOf(small_js2)+small_js2.length)
}
}
js_str1 = js_str1.substring(1,js_str1.length-1)
js_str2 = js_str2.substring(1,js_str2.length-1)
for(str_js1 <- js_str1.split(","); str_js2 <- js_str2.split(",")){
if(str_js1!="" && str_js2!="")
if(str_js1 == str_js2){
js_str1 = js_str1.substring(0,js_str1.indexOf(str_js1))+js_str1.substring(js_str1.indexOf(str_js1)+str_js1.length)
js_str2 = js_str2.substring(0,js_str2.indexOf(str_js2))+js_str2.substring(js_str2.indexOf(str_js2)+str_js2.length)
}
}
js_str1=js_str1.replace(",","")
js_str2=js_str2.replace(",","")
if(js_str1==""&&js_str2=="")return true
else return false
}
else return false
}
def split_JsonintoSmall(js_str: String):ArrayBuffer[String]={
val arrbuff = ArrayBuffer[String]()
var json_str = js_str
while(json_str.indexOf("{",1)>0 || json_str.indexOf("[",1)>0){
if (json_str.indexOf("{", 1) < json_str.indexOf("[", 1) && json_str.indexOf("{",1)>0 || json_str.indexOf("{", 1) > json_str.indexOf("[", 1) && json_str.indexOf("[",1)<0 ) {
val right = findrealm(1, json_str, '{', '}')
arrbuff += json_str.substring(json_str.indexOf("{", 1), right + 1)
json_str = json_str.substring(0,json_str.indexOf("{",1))+json_str.substring(right+1)
}
else {
if(json_str.indexOf("[",1)>0) {
val right = findrealm(1, json_str, '[', ']')
arrbuff += json_str.substring(json_str.indexOf("[", 1), right + 1)
json_str = json_str.substring(0, json_str.indexOf("[", 1)) + json_str.substring(right + 1)
}
}
}
arrbuff
}
def findrealm(begin_loc: Int, str: String, leftch: Char, rightch: Char): Int = {
var left = str.indexOf(leftch, begin_loc)
var right = str.indexOf(rightch, left)
left = str.indexOf(leftch, left + 1)
while (left < right && left > 0) {
right = str.indexOf(rightch, right + 1)
left = str.indexOf(leftch, left + 1)
}
right
}
def compare_2Json(js1:String,js2:String):布尔={
var js_str1=js1
var js_str2=js2
js_str1=js_str1.replaceAll(“,”)
js_str2=js_str2.replaceAll(“,”)
var isname=false
val arrbuff1=ArrayBuffer[String]()
val arrbuff2=ArrayBuffer[String]()
如果(js|str1.子字符串(0,1)=“{”&&js|str2.子字符串(0,1)=“{”| js|str1.子字符串(0,1)==”[”&&js|str2.子字符串(0,1)=“[”){
对于(小型js1 json字符串indexOf(“[”,1)和&json字符串indexOf(“[”,1)0){
val right=findrealm(1,json_str,[',']')
arrbuff+=json_str.substring(json_str.indexOf(“[”,1),右+1)
json_str=json_str.substring(0,json_str.indexOf(“[”,1))+json_str.substring(右+1)
}
}
}
阿里布夫
}
def findrealm(begin_loc:Int,str:String,leftch:Char,rightch:Char):Int={
var left=str.indexOf(leftch,begin\u loc)
var right=str.indexOf(rightch,left)
left=str.indexOf(leftch,left+1)
而(左<右和左>0){
right=str.indexOf(rightch,right+1)
left=str.indexOf(leftch,left+1)
}
正确的
}
spray json
确实很棒,但我使用了Gson
,因为我的项目已经依赖于Gson
库。我在单元测试中使用了它们,对简单的json很有效
import com.google.gson.{JsonParser}
import org.apache.flume.event.JSONEvent
import org.scalatest.FunSuite
class LogEnricherSpec extends FunSuite {
test("compares json to json") {
val parser = new JsonParser()
assert(parser.parse("""
{
"eventType" : "TransferItems",
"timeMillis" : "1234567890",
"messageXml":{
"TransferId" : 123456
}
} """.stripMargin)
==
parser.parse("""
{
"timeMillis" : "1234567890",
"eventType" : "TransferItems",
"messageXml":{
"TransferId" : 123456
}
}
""".stripMargin))
}
可以使用
=
操作符确认它也可以与库一起正常工作:
val simpleJson =
"""
|{"field1":"value1","field2":"value2"}
""".stripMargin
val simpleJsonNode = objectMapper.readTree(simpleJson)
val simpleJsonNodeFromString = objectMapper.readTree(simpleJsonNode.toString)
assert(simpleJsonNode == simpleJsonNodeFromString)
你也可以使用
例如:
它(“应该在稍微不同的json上失败,解释原因”){
val input=“”{“someField”:“valid json”}”“。stripMargin
val应为=“”{“someField”:“不同的json”}”“。stripMargin
输入应匹配JSON(预期)
}
当两个JSON不匹配时,将显示一个很好的差异,这在处理大型JSON时非常有用。您希望它们被视为不同吗?我希望它们被视为等于
js\u str1.replaceAll(“,”)
——这将从字符串值内部删除空格,使“foobar”等于“foobar”,对吗?
val simpleJson =
"""
|{"field1":"value1","field2":"value2"}
""".stripMargin
val simpleJsonNode = objectMapper.readTree(simpleJson)
val simpleJsonNodeFromString = objectMapper.readTree(simpleJsonNode.toString)
assert(simpleJsonNode == simpleJsonNodeFromString)