public void run() throws Exception { Moshi moshi = new Moshi.Builder() .add(new SortedSetAdapterFactory()) .build(); JsonAdapter<SortedSet<String>> jsonAdapter = moshi.adapter( Types.newParameterizedType(SortedSet.class, String.class)); TreeSet<String> model = new TreeSet<>(); model.add("a"); model.add("b"); model.add("c"); String json = jsonAdapter.toJson(model); System.out.println(json); }
public void run() throws Exception { String json = "[\"DIAMONDS\", \"STARS\", \"HEARTS\"]"; Moshi moshi = new Moshi.Builder() .add(DefaultOnDataMismatchAdapter.newFactory(Suit.class, Suit.CLUBS)) .build(); JsonAdapter<List<Suit>> jsonAdapter = moshi.adapter( Types.newParameterizedType(List.class, Suit.class)); List<Suit> suits = jsonAdapter.fromJson(json); System.out.println(suits); }
public void run() throws Exception { String json = "" + "[\n" + " {\n" + " \"rank\": \"4\",\n" + " \"suit\": \"CLUBS\"\n" + " },\n" + " {\n" + " \"rank\": \"A\",\n" + " \"suit\": \"HEARTS\"\n" + " },\n" + " {\n" + " \"rank\": \"J\",\n" + " \"suit\": \"SPADES\"\n" + " }\n" + "]"; Moshi moshi = new Moshi.Builder().build(); Type listOfCardsType = Types.newParameterizedType(List.class, Card.class); JsonAdapter<List<Card>> jsonAdapter = moshi.adapter(listOfCardsType); List<Card> cards = jsonAdapter.fromJson(json); System.out.println(cards); }
@SuppressWarnings("unchecked") MessageJsonAdapter(Moshi moshi, Type type) { this.messageAdapter = RuntimeMessageAdapter.create((Class<M>) type); this.fieldBindings = messageAdapter.fieldBindings() .values() .toArray(new FieldBinding[messageAdapter.fieldBindings().size()]); String[] names = new String[fieldBindings.length]; for (int i = 0; i < fieldBindings.length; i++) { names[i] = fieldBindings[i].name; } this.options = JsonReader.Options.of(names); jsonAdapters = new JsonAdapter[fieldBindings.length]; for (int i = 0; i < fieldBindings.length; i++) { FieldBinding<M, B> fieldBinding = fieldBindings[i]; Type fieldType = fieldBinding.singleAdapter().javaType; if (fieldBinding.isMap()) { Class<?> keyType = fieldBinding.keyAdapter().javaType; fieldType = Types.newParameterizedType(Map.class, keyType, fieldType); } else if (fieldBinding.label.isRepeated()) { fieldType = Types.newParameterizedType(List.class, fieldType); } Class<? extends Annotation>[] qualifiers = new Class[0]; if (fieldBinding.singleAdapter() == ProtoAdapter.UINT64) { qualifiers = new Class[] {Uint64.class}; } jsonAdapters[i] = moshi.adapter(fieldType, qualifiers); } }
ElementAtJsonAdapter(Type type, Moshi moshi, int index) { Type listType = Types.newParameterizedType(List.class, type); delegate = moshi.adapter(listType); this.index = index; }
LastElementJsonAdapter(Type type, Moshi moshi) { Type listType = Types.newParameterizedType(List.class, type); delegate = moshi.adapter(listType); }
/** * Get translated industry information. May be used throughout various XING APIs. * <p> * <b>Available languages:</b> {@code Language.EN, Language.DE, Language.ES, Language.FR, Language.IT, * Language.PT, Language.NL, Language.ZH, Language.RU, Language.PL, Language.TR} * <p> * For more information, please see the <a href="https://dev.xing.com/docs/industries">industries * documentation</a>. * * @param language The requested language. * @return A {@linkplain CallSpec callSpec} object ready to execute the request. * * @see <a href="https://dev.xing.com/docs/get/misc/industries">'Get translated industry information' resource * page.</a> */ public CallSpec<Map<Language, List<Industry>>, HttpError> getTranslatedIndustries(Language language) { return Resource.<Map<Language, List<Industry>>, HttpError>newGetSpec(api, "/v1/misc/industries") .responseAs(newParameterizedType(Map.class, Language.class, newParameterizedType(List.class, Industry.class))) .queryParam("languages", language) .build(); } }
@SuppressWarnings("unchecked") private <C extends Collection<T>, T> JsonAdapter<C> csAdapter(Type collectionType, Type elementType, Set<? extends Annotation> annotations) { return (JsonAdapter<C>) CsvCollectionJsonAdapter.FACTORY.create( Types.newParameterizedType(collectionType, elementType), annotations, moshi); } }
@Test public void toStringReflectsInnerAdapter() throws Exception { JsonAdapter<String> adapter = moshi.adapter(Types.newParameterizedType(Collection.class, String.class), FilterNulls.class); assertThat(adapter.toString()) .isEqualTo("JsonAdapter(String).nullSafe().collection().nullSafe().filterNulls()"); } }
@Test public void arrayOfObjects() throws Exception { JsonAdapter<List<Data2>> adapter = moshi.adapter( Types.newParameterizedType(List.class, Data2.class));
@Test public void nullValues() throws Exception { JsonAdapter<List<String>> adapter = moshi.adapter(Types.newParameterizedType(List.class, String.class), FilterNulls.class); List<String> fromJson = adapter.fromJson("[\"apple\",\"banana\",null]"); assertThat(fromJson).containsExactly("apple", "banana"); String toJson = adapter.toJson(new ArrayList<>(asList("apple", "banana", null))); assertThat(toJson).isEqualTo("[\"apple\",\"banana\"]"); }
@Test public void noNullValues() throws Exception { JsonAdapter<List<String>> adapter = moshi.adapter(Types.newParameterizedType(List.class, String.class), FilterNulls.class); List<String> fromJson = adapter.fromJson("[\"apple\",\"banana\"]"); assertThat(fromJson).containsExactly("apple", "banana"); String toJson = adapter.toJson(fromJson); assertThat(toJson).isEqualTo("[\"apple\",\"banana\"]"); }
@Test public void objectWithGenericsAndQualifiers() throws Exception { Type type = Types.newParameterizedType(ObjectWithGenericsAndQualifiers.class, String.class, Integer.class); JsonAdapter<ObjectWithGenericsAndQualifiers<String, Integer>> adapter = moshi.adapter(type); ObjectWithGenericsAndQualifiers<String, Integer> fromJson = adapter.fromJson("{\n" + " \"reversed_list\": [\"one\", \"two\", \"three\"],\n" + " \"reversedGeneric\": \"abc\",\n" + " \"reversedString\": \"def\",\n" + " \"normalString\": \"123\",\n" + " \"map\": {\n" + " \"foo\": 1,\n" + " \"bar\": 2\n" + " },\n" + " \"genericMap\": {\n" + " \"foo\": 1,\n" + " \"bar\": 2\n" + " },\n" + " \"genericSimple\":\"ghi\"" + "}"); Map<String, Integer> expectedMap = new HashMap<>(); expectedMap.put("foo", 1); expectedMap.put("bar", 2); assertThat(fromJson.map()).isEqualTo(expectedMap); assertThat(fromJson.genericMap()).isEqualTo(expectedMap); assertThat(fromJson.reversedList()).containsExactly("three", "two", "one"); assertThat(fromJson.reversedGeneric()).isEqualTo("cba"); assertThat(fromJson.reversedString()).isEqualTo("fed"); assertThat(fromJson.normalString()).isEqualTo("123"); assertThat(fromJson.genericSimple()).isEqualTo("ghi"); }
@Test public void nullList() throws Exception { JsonAdapter<List<String>> adapter = moshi.adapter(Types.newParameterizedType(List.class, String.class), FilterNulls.class); List<String> fromJson = adapter.fromJson("null"); assertThat(fromJson).isNull(); String toJson = adapter.toJson(null); assertThat(toJson).isEqualTo("null"); }
@Test public void factorySupportsType() throws Exception { Type parameterized = Types.newParameterizedType(List.class, String.class); List<String> fallback = Collections.singletonList("test"); // Build a moshi instance using the adapter under test and one that will throw on each read. Moshi moshi = buildMoshi(DefaultOnDataMismatchAdapter.newFactory(parameterized, fallback)) .newBuilder() .add(new JsonAdapter.Factory() { @Override public JsonAdapter<?> create(Type type, Set<? extends Annotation> annotations, Moshi moshi) { final JsonAdapter<Object> next = moshi.nextAdapter(this, type, annotations); return new JsonAdapter<Object>() { @Override public Object fromJson(JsonReader reader) throws IOException { throw new JsonDataException("Fail for all types"); } @Override public void toJson(JsonWriter writer, Object value) throws IOException { next.toJson(writer, value); } }; } }) .build(); JsonAdapter<List<String>> adapter = moshi.adapter(parameterized); List<String> fromJson = adapter.fromJson("[]"); assertThat(fromJson) .isEqualTo(fallback) .containsExactly("test"); String toJson = adapter.toJson(fromJson); assertThat(toJson).isEqualTo("[\"test\"]"); }