Не могу разобрать Json String с Моши - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь разобрать ответ Json с Моши, у меня проблема в том, что значение ключа - это перенос Json на строку:

{"mobile_accounts_account_showProperties":"[{\"name\": \"current\"},{\"name\": \"available\"}]"}

Это мой класс

@Json(name = "mobile_accounts_account_showProperties")
private List<PropertyConfig> showProperties;

Я пытаюсь удалить ("") с replace("\"[", "[") и replace("\\", "") перед разбором, но это не вариант, потому что это удаляет некоторые другие кавычки, которые мне нужны.Я пытаюсь использовать JsonAdapter, но не могу заставить это работать.JsonAdapter не получает вызов.

public class PropertyConfigJsonAdapter {

public PropertyConfigJsonAdapter() {
}

@ToJson
String toJson(List<PropertyConfig> card) {
    return "";
}

@FromJson
List<PropertyConfig> fromJson(String object) {

    return new ArrayList<>();
}

Я пытаюсь увидеть, получал ли вызов JsonAdapter, но он никогда не вызывал метод fromJson.Вот как я называю адаптер:

MoshiConverterFactory.create(new Moshi.Builder().add(new PropertyConfigJsonAdapter()).build())

1 Ответ

0 голосов
/ 27 ноября 2018

Самый простой способ - прочитать значение в виде строки и декодировать его оттуда.Вы можете сделать это прозрачным для кода своего приложения с помощью JsonAdapter, например ShowPropertiesContainer.ADAPTER ниже.

public final class ShowPropertiesContainer {
  public final List<PropertyConfig> showProperties;

  public static final Object ADAPTER = new Object() {
    @FromJson public ShowPropertiesContainer fromJson(JsonReader reader,
        JsonAdapter<ShowPropertiesContainer> fooAdapter,
        JsonAdapter<List<PropertyConfig>> propertyConfigListAdapter) throws IOException {
      ShowPropertiesContainer showPropertiesContainer = fooAdapter.fromJson(reader);
      return new ShowPropertiesContainer(propertyConfigListAdapter.fromJson(
          showPropertiesContainer.mobile_accounts_account_showProperties),
          showPropertiesContainer.mobile_accounts_account_showProperties);
    }
  };

  final String mobile_accounts_account_showProperties;

  ShowPropertiesContainer(List<PropertyConfig> showProperties,
      String mobile_accounts_account_showProperties) {
    this.showProperties = showProperties;
    this.mobile_accounts_account_showProperties = mobile_accounts_account_showProperties;
  }
}

public final class PropertyConfig {
  public final String name;

  PropertyConfig(String name) {
    this.name = name;
  }
}

@Test public void showPropertiesContainer() throws IOException {
  Moshi moshi = new Moshi.Builder()
      .add(ShowPropertiesContainer.ADAPTER)
      .build();
  JsonAdapter<ShowPropertiesContainer> adapter = moshi.adapter(ShowPropertiesContainer.class);
  String encoded =
      "{\"mobile_accounts_account_showProperties\":\"[{\\\"name\\\": \\\"current\\\"},"
          + "{\\\"name\\\": \\\"available\\\"}]\"}";
  ShowPropertiesContainer showPropertiesContainer = adapter.fromJson(encoded);
}
...