2016-05-16 4 views
4

私たちはリクエスト/応答の処理にjavax.jsonを使用するプロジェクトに取り組んでいます。私たちが使用する実装はorg.glassfish.jsonです。私に迷惑をかけているのは、Objectの追加/書き込みをサポートしていないということです。だから私はこの実装がサポートするすべての型をチェックしなければならないメソッドを作成しました。このようなもの:jsonビルディングのための型チェック/キャストの最適化

private static void addTypeSafeValue(JsonObjectBuilder jsonBuilder, String key, Object value) { 
     if (value instanceof String) { 
      jsonBuilder.add(key, value.toString()); 
     } else if (value instanceof Integer) { 
      jsonBuilder.add(key, (int) value); 
     } else if (value instanceof Boolean) { 
      jsonBuilder.add(key, (boolean) value); 
     } else if (value instanceof Long) { 
      jsonBuilder.add(key, (long) value); 
     } else if (value instanceof Double) { 
      jsonBuilder.add(key, (double) value); 
     } else if (value instanceof Uri) { 
      jsonBuilder.add(key, ((Uri) value).toString()); 
     } else if (value instanceof Map) { 
      jsonBuilder.add(key, convertToJsonObject((Map<String, ?>) value)); 
     } else if (value instanceof Collection) { 
      jsonBuilder.add(key, convertToJsonArray((Collection<?>) value)); 
     } else if (value instanceof JsonObject) { 
      jsonBuilder.add(key, (JsonObject) value); 
     } else if (value instanceof JsonArray) { 
      jsonBuilder.add(key, (JsonArray) value); 
     } else { 
      throw new IllegalArgumentException("Not implemented for: " + value.getClass()); 
     } 
    } 

このコードを最適化する方法があれば、私は疑問に思います。 もう一つの部分は、複写された小切手/コードをカットするために、消費者にJsonObjectBuilderまたはJsonGeneratorを渡したいということです。

答えて

1

TL; DRそれはそのままです。最適化に関する


は、あなたはおそらく、ワイヤ上で送信されるようにしてもbyte[]Stringかをしたいしながら、あなたは、(私は推測)ビルダー、構築するためにすべてのものを追加していることに注意してください。

最近、私はGsonが典型的にはリフレクションを行うよりもはるかに多くの時間をコピーに費やしていると読んでいます。だから私はあまり気にしないだろう。

私には、Objectの追加/書き込みがサポートされていません。

彼らは、その後、彼らはありませんあなたのような不完全な解決策のいずれかを提供(あなたのためではなく、ライブラリの罰金である)、またはそれを拡張可能にする必要があるだろうだろうし、その後ジャクソン、Gsonと多くのがあります場合はすでに他の人たち。

このコードを最適化する方法があれば、私は疑問に思います。

私は2つの方法を考えると、どちらをお勧めすることができます:

1:例数が小さくなるように、いくつかのグループを検索します。 value instanceof Numberをテストし、さらに分岐することができます。しかし、残りのケースよりもはるかに多くの数字が確かに多いので、ほとんど利益が得られません。

2:あなたのケースのためのコンバータが移入Map<Class, Consumer<Object>>を作成し、例数が膨大である場合、またはあなたが拡張性を必要とするときこれは良い解決策になる可能性が

map.get(value.getClass()).accept(value); 

のようなものを使用。あなたの10の場合、おそらくかなりの減速につながるでしょう。

他の部分は、私がJsonObjectBuilderまたはJsonGeneratorを消費者に渡していくつかの重複したチェック/コードを渡したいということです。

私はそれが価値があるとは思わない。 JsonObjectBuilderおよびJsonGeneratorは、2つの無関係なインターフェイスです。両方とも、関連していて、異なる名前が付けられており、必ずしも互いに対応しているわけではない方法の束を持っています。だから、両方のラッパーを書くか、あなたの質問のようにコードを複製する必要があります。最後に、とにかく重複したコードを取得します。

これはかなり醜いでしょう。私はGsonやJacksonのようなもっと強力なツールを見てみることをお勧めします。

+0

ビルダーとジェネレーターはパラメーター(キー、値)として受け入れますが、関数の名前のみが異なります。私は両方のためにこのチェックを使用したい(方法がある場合)。このようなもの:addTypeSafeValue(コンシューマコンシューマ、Stringキー、オブジェクト値)また、あなたの答えに感謝します。 – Tony

関連する問題