Browse Source
The logic in GsonCodec was split into GsonEncoder and GsonDecoder, each of which can now be used separately. GsonCodec was deprecated, and can be removed in the next major version. To facilitate use outside of Dagger, the double-to-int map type adapter was broken into its own class, and is included by default when using the default constructors of either the encoder or decoder. The examples have been updated to use the new encoder/decoder instead of the codec.pull/80/head
10 changed files with 182 additions and 75 deletions
@ -0,0 +1,54 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2013 Netflix, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package feign.gson; |
||||||
|
|
||||||
|
import com.google.gson.Gson; |
||||||
|
import com.google.gson.InstanceCreator; |
||||||
|
import com.google.gson.TypeAdapter; |
||||||
|
import com.google.gson.internal.ConstructorConstructor; |
||||||
|
import com.google.gson.internal.bind.MapTypeAdapterFactory; |
||||||
|
import com.google.gson.reflect.TypeToken; |
||||||
|
import com.google.gson.stream.JsonReader; |
||||||
|
import com.google.gson.stream.JsonWriter; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.lang.reflect.Type; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* Deals with scenario where Gson Object type treats all numbers as doubles. |
||||||
|
*/ |
||||||
|
public class DoubleToIntMapTypeAdapter extends TypeAdapter<Map<String, Object>> { |
||||||
|
final static TypeToken<Map<String, Object>> token = new TypeToken<Map<String, Object>>() {}; |
||||||
|
|
||||||
|
private final TypeAdapter<Map<String, Object>> delegate = new MapTypeAdapterFactory(new ConstructorConstructor( |
||||||
|
Collections.<Type, InstanceCreator<?>>emptyMap()), false).create(new Gson(), token); |
||||||
|
|
||||||
|
@Override public void write(JsonWriter out, Map<String, Object> value) throws IOException { |
||||||
|
delegate.write(out, value); |
||||||
|
} |
||||||
|
|
||||||
|
@Override public Map<String, Object> read(JsonReader in) throws IOException { |
||||||
|
Map<String, Object> map = delegate.read(in); |
||||||
|
for (Map.Entry<String, Object> entry : map.entrySet()) { |
||||||
|
if (entry.getValue() instanceof Double) { |
||||||
|
entry.setValue(Double.class.cast(entry.getValue()).intValue()); |
||||||
|
} |
||||||
|
} |
||||||
|
return map; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,56 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2013 Netflix, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package feign.gson; |
||||||
|
|
||||||
|
import com.google.gson.Gson; |
||||||
|
import com.google.gson.JsonIOException; |
||||||
|
import feign.Response; |
||||||
|
import feign.codec.Decoder; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.Reader; |
||||||
|
import java.lang.reflect.Type; |
||||||
|
|
||||||
|
import static feign.Util.ensureClosed; |
||||||
|
|
||||||
|
public class GsonDecoder implements Decoder { |
||||||
|
private final Gson gson; |
||||||
|
|
||||||
|
public GsonDecoder() { |
||||||
|
this(new Gson()); |
||||||
|
} |
||||||
|
|
||||||
|
public GsonDecoder(Gson gson) { |
||||||
|
this.gson = gson; |
||||||
|
} |
||||||
|
|
||||||
|
@Override public Object decode(Response response, Type type) throws IOException { |
||||||
|
if (response.body() == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
Reader reader = response.body().asReader(); |
||||||
|
try { |
||||||
|
return gson.fromJson(reader, type); |
||||||
|
} catch (JsonIOException e) { |
||||||
|
if (e.getCause() != null && e.getCause() instanceof IOException) { |
||||||
|
throw IOException.class.cast(e.getCause()); |
||||||
|
} |
||||||
|
throw e; |
||||||
|
} finally { |
||||||
|
ensureClosed(reader); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2013 Netflix, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package feign.gson; |
||||||
|
|
||||||
|
import com.google.gson.Gson; |
||||||
|
import feign.RequestTemplate; |
||||||
|
import feign.codec.Encoder; |
||||||
|
|
||||||
|
public class GsonEncoder implements Encoder { |
||||||
|
private final Gson gson; |
||||||
|
|
||||||
|
public GsonEncoder() { |
||||||
|
this(new Gson()); |
||||||
|
} |
||||||
|
|
||||||
|
public GsonEncoder(Gson gson) { |
||||||
|
this.gson = gson; |
||||||
|
} |
||||||
|
|
||||||
|
@Override public void encode(Object object, RequestTemplate template) { |
||||||
|
template.body(gson.toJson(object)); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue