У меня есть класс во Flutter:
class Foo {
String id;
int power;
Foo (this.id, this.power);
Map toJson() => {
'id': id,
'power': power
};
}
Я создал экземпляр этого объекта и передал его на Android через MethodChannel как String
:
_myChannel.invokeMethod('custom_event', {
'foo': foo.toJson().toString(),
});
В Android я извлекаю эту строку и хочу преобразовать в объект Foo на стороне Android, поэтому:
val fooString = call.method.argument<String>("foo")
//output: {id: my_id, power: 23}
val response = fooString?.let { Response(it) }
//output {"id":"my_id","power":"23"}
Вспомогательный класс:
class Response(json: String) : JSONObject(json) {
val data = this.optJSONArray(null)
?.let { 0.until(it.length()).map { i -> it.optJSONObject(i) } } // returns an array of JSONObject
?.map { FooJson(it.toString()) } // transforms each JSONObject of the array into Foo
}
class FooJson(json: String) : JSONObject(json) {
val id: String = this.optString("id")
val power: String = this.optInt("power")
}
Как я могу преобразовать ответ в свой класс Котлина?
Да, я хочу передать список объектов из Flutter в Android в виде строки, а затем снова преобразовать строку в список объектов.
Поскольку Foo
содержит только строку и целое число, оба из которых поддерживаются кодеком сообщения по умолчанию, имеет смысл просто передать эти два значения в карте. (На самом деле у вас уже есть метод, создающий эту карту, toJson
, хотя лучше назвать его toMap
.)
Не вызывайте toString
на этой карте; вместо этого используйте:
_myChannel.invokeMethod('custom_event', foo.toMap());
Теперь вы вызываете метод и передаете карту. На исходном конце вы будете искать участников, используя их ключи карты (т. е. id
и power
), используя .argument<T>
, как вы пытались, следующим образом:
val id = call.method.argument<String>("id");
Вы можете, конечно, затем создать POJO, который обертывает объект вокруг этих двух значений, если это действительно необходимо.
Для более сложных сообщений рассмотрите Pigeon. Если вы действительно хотите использовать JSON в качестве метода сериализации, посмотрите на существующий кодек сообщений JSON.
Я хочу обработать список передачи объектов Foo, поэтому я подумал, что синтаксический анализ объекта в строку, а затем в json - хорошая идея. Я не хочу использовать какую-либо внешнюю библиотеку для этого.
Это не очень хорошая идея, поскольку кодек по умолчанию уже может создавать списки, карты, строки и т. д. Зачем изобретать велосипед? Если вы хотите передать список Foos, превратите каждый Foo в карту, поместите их в список и передайте список для вызова метода. В конце Java вы получите ArrayList HashMaps - его легко пройти.
Что мне использовать, если в моем классе Foo есть идентификатор, мощность и еще 2 переменные?
Та же карта с двумя дополнительными ключами/значениями, например {.... 'isAlive': isAlive, 'logPower': logPower}
, показывающая пример возможности передать логическое значение и двойное значение напрямую.
Не могли бы вы указать проблему, пожалуйста? Поскольку у вас есть класс Response, который анализирует JSON. Но это выглядит странно, потому что вы пытаетесь проанализировать массив вместо объекта