Json解码失败?

Posted

技术标签:

【中文标题】Json解码失败?【英文标题】:Json Decoding Failed? 【发布时间】:2020-01-18 01:02:53 【问题描述】:

https://picsum.photos/v2/list?page=1&limit=50 我正在使用这个 Json 文件,但是当我尝试解码时它显示为 null。

我试过了

'''

List imgData;

final String url = 'https://picsum.photos/v2/list?page=1&limit=50';
Future getData() async 
var response = await http
    .get(Uri.encodeFull(url), headers: 'Accept': 'application/json');

List data = jsonDecode(response.body)['results'];
setState(() 
  imgData = data;
);


@override
void initState() 
super.initState();
this.getData();

'''

【问题讨论】:

【参考方案1】:

您可以使用在线免费提供的JSON to dart tool。

将您的 JSON 粘贴到左侧面板并从右上角选择 dart 语言,

您将获得 dart 类代码,您可以在其中使用 .toMap() 和 .toJson() 等方法,

而且速度非常快,人为错误更少。

这对于庞大的 JSON 数据非常有用。

您将从这个工具中为您的数据获得这样的课程。

// To parse this JSON data, do
//
//     final data = dataFromJson(jsonString);

import 'dart:convert';

List<Data> dataFromJson(String str) => List<Data>.from(json.decode(str).map((x) => Data.fromMap(x)));

String dataToJson(List<Data> data) => json.encode(List<dynamic>.from(data.map((x) => x.toMap())));

class Data 
    String id;
    String author;
    int width;
    int height;
    String url;
    String downloadUrl;

    Data(
        this.id,
        this.author,
        this.width,
        this.height,
        this.url,
        this.downloadUrl,
    );

    factory Data.fromMap(Map<String, dynamic> json) => Data(
        id: json["id"],
        author: json["author"],
        width: json["width"],
        height: json["height"],
        url: json["url"],
        downloadUrl: json["download_url"],
    );

    Map<String, dynamic> toMap() => 
        "id": id,
        "author": author,
        "width": width,
        "height": height,
        "url": url,
        "download_url": downloadUrl,
    ;

之后就可以使用dataFromJson方法了。

这可以是您代码的完整实现。

import 'dart:convert';

List imgData;

final String url = 'https://picsum.photos/v2/list?page=1&limit=50';
Future getData() async 
  var response = await http
      .get(Uri.encodeFull(url), headers: 'Accept': 'application/json');

  List data = dataFromJson(response.body);
  setState(() 
    imgData = data;
  );


@override
void initState() 
  super.initState();
  this.getData();



List<Data> dataFromJson(String str) => List<Data>.from(json.decode(str).map((x) => Data.fromMap(x)));

String dataToJson(List<Data> data) => json.encode(List<dynamic>.from(data.map((x) => x.toMap())));

class Data 
  String id;
  String author;
  int width;
  int height;
  String url;
  String downloadUrl;

  Data(
    this.id,
    this.author,
    this.width,
    this.height,
    this.url,
    this.downloadUrl,
  );

  factory Data.fromMap(Map<String, dynamic> json) => Data(
    id: json["id"],
    author: json["author"],
    width: json["width"],
    height: json["height"],
    url: json["url"],
    downloadUrl: json["download_url"],
  );

  Map<String, dynamic> toMap() => 
    "id": id,
    "author": author,
    "width": width,
    "height": height,
    "url": url,
    "download_url": downloadUrl,
  ;

【讨论】:

您好,您能帮我看看您所说的“您可以使用 .toMap() 和 .toJson() 之类的方法”,有什么指南吗?初学者通过这个找到出路 是的,我已经编辑了答案。如果您还有任何问题,请随时发表评论。【参考方案2】:

尝试在下面替换

List data = jsonDecode(response.body)['results'];

List data = jsonDecode(response.body);

您的 JSON 中没有 results 参数

【讨论】:

以上是关于Json解码失败?的主要内容,如果未能解决你的问题,请参考以下文章

Swift解码字符串JSON失败

遇到一个json解码失败的问题

解码 json 无法打开流:HTTP 请求失败!错误

我如何很好地解码Laravel失败的工作JSON

如果单元素解码失败,Swift JSONDecode 解码数组将失败

使用 Arduino 解码较大的 DES 数据失败