Kotlin: Может ли JSONObject анализировать пользовательский объект? - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь сохранить объект карты в android общих настройках, для которых ниже приведен код:

private fun setMap(context: Context, key: String, value: Map<String, Any>) {
        val editor = PreferenceManager.getDefaultSharedPreferences(context).edit()
        val jsonObject = JSONObject(value)
        val jsonString = jsonObject.toString()
        editor.putString(key, jsonString)
        editor.apply()
}

Если моя карта имеет тип Map<String, String> or Map<"test","123">, то приведенный выше код работает нормально и jsonObject в строке 2 - {"test", "123"}.

Однако, если моя Карта содержит какой-либо пользовательский объект, такой как Map<String, CustomObject> i.e. Map<"test", CustomObject()>, тогда я jsonObject в строке 2 равен {"test", null}.

Может ли JSONObject анализировать пользовательский объект?

Ответы [ 2 ]

0 голосов
/ 26 января 2020

В этом случае вы должны взглянуть на реализацию JSONObject.

Документация для параметра JSONObject(Map) состояний конструктора

 * @param copyFrom a map whose keys are of type {@link String} and whose
 *     values are of supported types.

Но чтобы найти, что составляет действительное значение, вы должны посмотреть на wrap(entry.getValue()), который вызывается в конструкторе. Документация для wrap гласит:

/**
 * Wraps the given object if necessary.
 *
 * <p>If the object is null or , returns {@link #NULL}.
 * If the object is a {@code JSONArray} or {@code JSONObject}, no wrapping is necessary.
 * If the object is {@code NULL}, no wrapping is necessary.
 * If the object is an array or {@code Collection}, returns an equivalent {@code JSONArray}.
 * If the object is a {@code Map}, returns an equivalent {@code JSONObject}.
 * If the object is a primitive wrapper type or {@code String}, returns the object.
 * Otherwise if the object is from a {@code java} package, returns the result of {@code toString}.
 * If wrapping fails, returns null.
 */

В вашем случае, я предполагаю, что значение вашей карты не соответствует ни одному из критериев для возврата ненулевого значения, что я ожидаю для non java.* non JSON* object.

С учетом вышесказанного я бы посоветовал не хранить сложные объекты и структуры в SharedPreferences (это не оптимально) и предложил бы использовать базу данных. Однако, если вы настроены на этом маршруте, обязательно посмотрите библиотеку Kotlin Serialization .

0 голосов
/ 25 января 2020

Вы можете проанализировать json (т.е. преобразовать ваш объект в json и преобразовать json в ваш объект), используя библиотеку Gson или эту библиотеку: https://github.com/Kotlin/kotlinx.serialization

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...