2

私は現在、Javaでjsonrpc-clientを書いています。リクエストは、次のようなJSONObjectで表されます。

{'method': 'do.stuff', 'params': ['asdf', 3, {'foo': 'bar'}]}

ここで、低レベルのリクエストキャッシュを実装したいと思います。このために、常に同じ値を返すJSONObjectからハッシュを作成する方法が必要です。JSONObjectsは順序付けされていないため、toString()を使用することはできません。次の例は、文字列の表現が異なっていても、最初の例とまったく同じです。

{'params': ['asdf', 3, {'foo': 'bar'}], 'method': 'do.stuff'}

この問題の最善の解決策は何ですか?もちろん、jsonobjectは任意の深さにネストできます。私はJavaにかなり慣れていないので、どんな提案にも感謝しています。

4

4 に答える 4

10

ジャクソンを見てみたい:すべてのJSON値(数値、ブール値、文字列、オブジェクトを再帰的に、配列を再帰的に、null)について、入力JsonNodeを実装.equals()し、.hashCode()正しく(つまり、によって確立されたコントラクトに固執するjava.lang.Object)として読み取ります。。

于 2013-01-02T22:00:18.450 に答える
2
I agree with @fge's solution. This is working for me across multiple variations of a JSON structure - 

    int hash = 0;
    ObjectMapper mapper = new ObjectMapper();
    JsonFactory factory = mapper.getFactory();
    try {
        JsonNode jsonNode = mapper.readTree(factory.createParser(jsonString));
        hash = jsonNode.hashCode();
    } catch (IOException e) {
        LOG.error("Error generating hash for jsonString: {}", jsonString);
        e.printStackTrace();
    }


Example permutations - 
 "{ k1: v1, k2:v2, k3: v3}"
 "{ k3: v3, k2:v2, k1: v1}"
 "{ k3: v3, k1:v1, k2: v2}"

All 3 produced same hashcode everytime. In practice however my json also had ArrayList and Map within itself and that worked perfectly well too.
于 2020-05-26T06:49:28.840 に答える
0

要素の順序や文字列表現に依存しないため、JSONObjectでhashCodeメソッドを呼び出すことをお勧めします。

于 2013-01-02T22:00:27.113 に答える
-4

あなたはただすることができます.toString().hashCode()

JSONは順序付けされていませんが、文字列は毎回同じ方法で生成されると思います。偶然でも、それらが同じように生成されなかったとしても、キャッシュには2つのオブジェクトがあり、おそらく世界の終わりではないでしょう。

于 2013-01-02T22:10:42.337 に答える