Как проверить NULL при отображении вложенного JSON? - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь отобразить вложенный JSON в объект модели, проблема в том, что когда он возвращает ноль, он нарушает весь код, я хочу проверить, если ноль что-то делает, но не ломает приложение.

ФАЙЛ JSON:

[
    {
        "id": 53,
        "date": "2018-12-28T08:51:11",
        "title": {
            "rendered": "this is for featured"
        },
        "content": {
            "rendered": "\n<p><g class=\"gr_ gr_3 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling\" id=\"3\" data-gr-id=\"3\">sdafkj</g> <g class=\"gr_ gr_10 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"10\" data-gr-id=\"10\">kj</g> <g class=\"gr_ gr_16 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace\" id=\"16\" data-gr-id=\"16\">asd</g> <g class=\"gr_ gr_18 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling\" id=\"18\" data-gr-id=\"18\">kadjsfk</g> kljadfklj sd</p>\n",
            "protected": false
        },
        "excerpt": {
            "rendered": "<p>sdafkj kj asd kadjsfk kljadfklj sd</p>\n",
            "protected": false
        },
        "author": 1,
        "featured_media": 54,
        "_links": {
            "self": [
                {
                    "href": "https://client.kurd.app/wp-json/wp/v2/posts/53"
                }
            ],

        },
        "_embedded": {
            "author": [
                {
                    "id": 1,
                    "name": "hooshyar",

                }
            ],
            "wp:featuredmedia": [
                {
                    "id": 54,

                    "source_url": "https://client.kurd.app/wp-content/uploads/2018/12/icannotknow_22_12_2018_18_48_11_430.jpg",
                    }
                    ]
}
]

КОД ДЛЯ КАРТИРОВАНИЯ ОБЪЕКТА:

  featuredMediaUrl = map ["_embedded"]["wp:featuredmedia"][0]["source_url"];

Метод 'map' был вызван для нуля.Получатель: ноль [0], который иногда возвращает ноль;

1 Ответ

0 голосов
/ 28 декабря 2018

После моего комментария я предлагаю вам использовать библиотеку генерации кода для разбора JSON до JSON Models.

Чтение этой статьи , объясняющей, как использовать (например)пакет json_serializable .

Такие библиотеки выполняют всю грязную работу по генерации всего шаблонного кода для создания классов вашей модели, и они заботятся о значениях null какобязательно или нет.

Например, если вы аннотируете класс Person следующим образом:

@JsonSerializable(nullable: true)
class Person {
  final String firstName;
  final String lastName;
  final DateTime dateOfBirth;
  Person({this.firstName, this.lastName, this.dateOfBirth});
  factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
  Map<String, dynamic> toJson() => _$PersonToJson(this);
}

с помощью (nullable: true), в классе дротиков вашей модели поля пустых значений будут пропущены.

enter image description here

ОБНОВЛЕНИЕ

Поскольку я стремлюсь к технологии, я дал quicktype инструмент (предложенный Кристофом Лахенихтом) попробуйте на вашем примере.

Я подготовил mock api и файл example.json, содержащий JSON, который вы опубликовали.Я взял только один элемент, а не массив.И вы можете посмотреть здесь example.json .

После установки в QuickType я сгенерировал класс модели для этого json:

quicktype --lang dart --all-properties-optional example.json -o example.dart

Обратите внимание, что здесьПараметр cli --all-properties-optional, который создает нулевые проверки для пропущенных полей.

Map<String, dynamic> toJson() => {
    "id": id == null ? null : id,
    "date": date == null ? null : date,
    "title": title == null ? null : title.toJson(),
    "content": content == null ? null : content.toJson(),
    "excerpt": excerpt == null ? null : excerpt.toJson(),
    "author": author == null ? null : author,
    "featured_media": featuredMedia == null ? null : featuredMedia,
    "_links": links == null ? null : links.toJson(),
    "_embedded": embedded == null ? null : embedded.toJson(),
};

Затем я использовал класс Example в example.dart

var jsonExampleResponse =
    await http.get('https://www.shadowsheep.it/so/53962129/testjson.php');
print(jsonExampleResponse.body);

var exampleClass = exampleFromJson(jsonExampleResponse.body);
print(exampleClass.toJson());

И все прошло нормально.

NB Конечно, когда вы используете этот класс, вы должны проверить, если его поля пусты, прежде чем их использовать:

print(exampleClass.embedded?.wpFeaturedmedia?.toString());

Вот и все.Я надеюсь направить вас в правильном направлении.

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