2016-06-15 6 views
-1

私はjsonオブジェクトでいくつかのテストを実行しようとしています。現在、私は、彼らが一致しない場合はJSON文字列と出力にエラーメッセージを比較する機能を持っている:go testマップ間の相違

func assertJsonEqual(expected, actual string) bool { 
    actualStruct := make(map[string]interface{}) 
    expectedStruct := make(map[string]interface{}) 

    json.Unmarshal([]byte(expected), &expectedStruct) 
    json.Unmarshal([]byte(actual), &actualStruct) 

    if !reflect.DeepEqual(expectedStruct, actualStruct) { 
     log.Errorf("Expected: %#v\n but got %#v", expectedStruct, actualStruct) 
     return false 
    } 
    return true 
} 

問題は、これが、それは本当にハードに実際のツールに欠けているか、余分なさを正確にどのキーを参照することができますです。私はマップキーの単純なdiffを構築することを考えていますが、既にこれを行う既存のライブラリがあるのだろうかと疑問に思っていますか?

答えて

0

既存の機能はありません。5行のコードのようです。

diff := &[]string{} // initialize some storage for the diff 

for _, k := range map1 { // range over one of the maps 
    if _, ok := map2[k]; !ok { // check if the key from the first map exists in the second 
     diff = append(diff, k) 
    } 
} 
+0

入れ子の違いがある可能性があるため、少し複雑です。私は先に行って自分自身を作ろうとします。 –

+0

@ JoshWilsonまたは単に構造体を定義して、深い等価性を持つ構造体のためのメソッドを定義することができます...理由のない汎用コードを書くことは愚かであり、通常は品質が悪くなります。実際のJSONは明らかにキーがないので、アンマーシャリングの時点で失敗するだけです。 – evanmcdonnal