flutter 如何通过字段访问JSON?

3qpi33ja  于 2023-01-14  发布在  Flutter
关注(0)|答案(4)|浏览(100)

我有一个JSON
jsonData

{
    "data": {
      "splashPage": {
        "title": "Splash"
      },
      "homePage": {
        "title": "Home"
      }
    }
}
List<String> accessField = ['data','splashPage']; 
final out = accessField.map((e) => "['$e']").join();
Map jsonMapData = jsonDecode(jsonData); 
Map<String, dynamic> splashPageJson = '${jsonMapData}$out' as Map<String, dynamic>; 
print(splashPageJson);

我得到一个错误无法访问splashPage。

_CastError (type 'String' is not a subtype of type 'Map<String, dynamic>' in type cast)

如何从JSON访问splashPage?
注意:accessField是动态值
如果我想访问splashPage,声明

accessField = ['data','splashPage'];

如果我想访问主页,声明

accessField = ['data','homePage'];
8mmmxcuj

8mmmxcuj1#

这就是你想要的吗?

var jsonData = {
    "data": {
      "splashPage": {
        "title": "Splash"
      },
      "homePage": {
        "title": "Home"
      }
    }
}

Map jsonMapData = jsonDecode(jsonData); 

List<String> accessField = ['data','splashPage'];

Map<String, dynamic> requiredResult = jsonMapData[accessField[0]][accessField[1]];
mccptt67

mccptt672#

解决方案如下:
首次导入:

import 'dart:convert';

要将JSON存储到Map中:

final Map<String, dynamic> map = json.decode('{"data":{"splashPage":{"title":"Splash"},"homePage":{"title":"Home"}}}');

要打印需求:

print(map["data"]["splashPage"]["title"]);
pbossiut

pbossiut3#

您的型号代码:

class Model {
  Model({
    this.data,
  });

  Model.fromJson(Map<String, dynamic> json) {
    data = json["data"] != null ? Data.fromJson(json["data"]) : null;
  }
  Data? data;

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> map = <String, dynamic>{};
    if (data != null) {
      map["data"] = data?.toJson();
    }
    return map;
  }
}

class Data {
  Data({
    this.splashPage,
    this.homePage,
  });

  Data.fromJson(Map<String, dynamic> json) {
    splashPage = json["splashPage"] != null
        ? SplashPage.fromJson(json["splashPage"])
        : null;
    homePage =
        json["homePage"] != null ? HomePage.fromJson(json["homePage"]) : null;
  }
  SplashPage? splashPage;
  HomePage? homePage;

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> map = <String, dynamic>{};
    if (splashPage != null) {
      map["splashPage"] = splashPage?.toJson();
    }
    if (homePage != null) {
      map["homePage"] = homePage?.toJson();
    }
    return map;
  }
}

class HomePage {
  HomePage({
    this.title,
  });

  HomePage.fromJson(Map<String, dynamic> json) {
    title = json["title"];
  }
  String? title;

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> map = <String, dynamic>{};
    map["title"] = title;
    return map;
  }
}

class SplashPage {
  SplashPage({
    this.title,
  });

  SplashPage.fromJson(Map<String, dynamic> json) {
    title = json["title"];
  }
  String? title;

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> map = <String, dynamic>{};
    map["title"] = title;
    return map;
  }
}

用于您的用途的代码:

final Model model = Model.fromJson(
    json.decode(
      '{"data":{"splashPage":{"title":"Splash"},"homePage":{"title":"Home"}}}',
    ),
  );

print(model.data?.splashPage?.title ?? "");
print(model.data?.homePage?.title ?? "");

不要忘记导入:

import 'dart:convert';
kiayqfof

kiayqfof4#

  • 这是一个Json数据格式到原生数据模型的转换问题,如果Json数据发布的早一些,问题可能就不会那么复杂了
  • 试试这个。
void test() {
    var json =
        '{"data":{"splashPage":{"title":"Splash"},"homePage":{"title":"Home"}}}';
    var map = jsonDecode(json) as Map<String, dynamic>;
    var model = DataResponseModel.fromJson(map);
    pr(model.data?.homePage?.title); // Home
    pr(model.data?.splashPage?.title); // Splash
  }


class TitleModel {
  String? title;
  TitleModel({required this.title});
  factory TitleModel.fromJson(Map<String, dynamic> map) =>
      TitleModel(title: map['title']);
}

class DataModel {
  TitleModel? splashPage;
  TitleModel? homePage;
  DataModel({required this.splashPage, this.homePage});
  factory DataModel.fromJson(Map<String, dynamic> map) => DataModel(
        splashPage: TitleModel.fromJson(map['splashPage']),
        homePage: TitleModel.fromJson(map['homePage']),
      );
}

class DataResponseModel {
  DataModel? data;
  DataResponseModel({required this.data});
  factory DataResponseModel.fromJson(Map<String, dynamic> map) =>
      DataResponseModel(
        data: DataModel.fromJson(map['data']),
      );
}

相关问题