Как получить объект MutableList & lt; MDetail & gt ;? от json, используя Gson в Котлине? [Дубликат]

Как объяснил scompt.com , запрос может завершиться ошибкой. Используйте этот код, чтобы получить ошибку запроса или правильный результат:

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query("
SELECT * FROM Users 
WHERE UserName LIKE '".mysql_real_escape_string($username)."'
");

if($result)
{
    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
} else {
    echo 'Invalid query: ' . mysql_error() . "\n";
    echo 'Whole query: ' . $query; 
}

Для получения дополнительной информации см. Документацию для mysql_query() .

Фактической ошибкой были одиночные кавычки, так что переменная $username не анализировалась. Но вы действительно должны использовать mysql_real_escape_string($username), чтобы избежать инъекций SQL.

47
задан Juancho 28 October 2015 в 02:29
поделиться

6 ответов

Создайте это встроенное удовольствие:

inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)

, а затем вы можете вызвать его следующим образом:

val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)

ПРИМЕЧАНИЕ. Этот подход не был возможен раньше в старом плагине kotlin версии, но теперь вы можете использовать его.


Предыдущие альтернативы:

АЛЬТЕРНАТИВА 1:

val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)

Вы должны положить object : и конкретный тип в fromJson<List<Turns>>

<ч>

Альтернативный вариант 2:

Как @cypressious упомянуть, что может быть достигнуто также таким образом:

inline fun <reified T> genericType() = object: TypeToken<T>() {}.type

использовать как:

val turnsType = genericType<List<Turns>>()
100
ответ дан Juancho 25 August 2018 в 16:57
поделиться
val obj: MutableList<SaleItemResponse> = Gson().fromJson(messageAfterDecrypt,
    object : TypeToken<List<SaleItemResponse>>() {}.type)

Это мой способ анализа массива данных в kotlin.

1
ответ дан AsifAli72090 25 August 2018 в 16:57
поделиться

Это работает также и проще

    inline fun <reified T> Gson.fromJson(json: String) : T = 
         this.fromJson<T>(json, T::class.java)
2
ответ дан Christopher Perry 25 August 2018 в 16:57
поделиться

Я использовал что-то вроде этого, чтобы преобразовать T в string & amp; String вернуться к T с помощью Gson. Не все, что вы ищете, но на всякий случай.

Объявление расширения

inline fun <reified T : Any> T.json(): String = Gson().toJson(this, T::class.java)
inline fun <reified T : Any> String.fromJson(): T = Gson().fromJson(this,T::class.java)

Использование

// Passing an object to new Fragment
companion object {    
        private const val ARG_SHOP = "arg-shop"

        @JvmStatic
        fun newInstance(shop: Shop) =
                ShopInfoFragment().apply {
                    arguments = Bundle().apply {
                        putString(ARG_SHOP, shop.json())
                    }
                }
    }

// Parsing the passed argument
private lateinit var shop: Shop

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            shop = it.getString(ARG_SHOP).fromJson() ?: return
        }
    }
0
ответ дан harsh_v 25 August 2018 в 16:57
поделиться

Это решает проблему:

val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)

Первая строка создает выражение object , которое спускается с TypeToken, а затем получает Java Type. Тогда методу Gson().fromJson нужен либо тип, указанный для результата функции (который должен соответствовать созданному TypeToken). Две версии этой работы, как указано выше, или:

val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)

Чтобы упростить создание TypeToken, вы можете создать вспомогательную функцию, которая должна быть inline так что он может использовать параметры reified type :

inline fun <reified T> genericType() = object: TypeToken<T>() {}.type

, который затем может быть использован одним из следующих способов:

val turnsType = genericType<List<Turns>>()
// or
val turnsType: List<Turns> = genericType()

И весь процесс может быть завернут в функцию расширения для экземпляра Gson:

inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)

Чтобы вы могли просто позвонить Gson и не беспокоиться о TypeToken вообще:

val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)

Здесь Котлин использует вывод типа с одной стороны задания или другой, и генерирует обобщенные данные для встроенной функции для прохождения через полный тип (без стирания) и используя это для построения TypeToken, а также делает звоните в Gson

21
ответ дан Jayson Minard 25 August 2018 в 16:57
поделиться

Другой вариант (не уверен, что он выглядит более элегантным, чем другие) может быть вызовом следующим образом:

turns = Gson().fromJson(allPurchasesString, Array<Turns>::class.java).toMutableList()

Таким образом, вы используете линейку класса java Array класса, а не «чистый Kotlin».

2
ответ дан MartinVonMartinsgrün 25 August 2018 в 16:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: