json_model icon indicating copy to clipboard operation
json_model copied to clipboard

解析嵌套json数据出现问题

Open yangchong211 opened this issue 5 years ago • 3 comments

json代码示例

{
  "data":[
    {
      "desc":"Android高级进阶直播课免费学习",
      "id":22,
      "imagePath":"https://wanandroid.com/blogimgs/fbed8f14-1043-4a43-a7ee-0651996f7c49.jpeg",
      "isVisible":1,
      "order":0,
      "title":"Android高级进阶直播课免费学习",
      "type":0,
      "url":"https://url.163.com/4bj"
    },
    {
      "desc":"一起来做个App吧",
      "id":10,
      "imagePath":"https://www.wanandroid.com/blogimgs/50c115c2-cf6c-4802-aa7b-a4334de444cd.png",
      "isVisible":1,
      "order":2,
      "title":"一起来做个App吧",
      "type":0,
      "url":"http://www.wanandroid.com/blog/show/2"
    },
    {
      "desc":"",
      "id":4,
      "imagePath":"https://www.wanandroid.com/blogimgs/ab17e8f9-6b79-450b-8079-0f2287eb6f0f.png",
      "isVisible":1,
      "order":0,
      "title":"看看别人的面经,搞定面试~",
      "type":1,
      "url":"http://www.wanandroid.com/article/list/0?cid=73"
    },
    {
      "desc":"",
      "id":3,
      "imagePath":"https://www.wanandroid.com/blogimgs/fb0ea461-e00a-482b-814f-4faca5761427.png",
      "isVisible":1,
      "order":1,
      "title":"兄弟,要不要挑个项目学习下?",
      "type":1,
      "url":"http://www.wanandroid.com/project"
    },
    {
      "desc":"",
      "id":6,
      "imagePath":"https://www.wanandroid.com/blogimgs/62c1bd68-b5f3-4a3c-a649-7ca8c7dfabe6.png",
      "isVisible":1,
      "order":1,
      "title":"我们新增了一个常用导航Tab~",
      "type":1,
      "url":"http://www.wanandroid.com/navi"
    },
    {
      "desc":"",
      "id":18,
      "imagePath":"https://www.wanandroid.com/blogimgs/00f83f1d-3c50-439f-b705-54a49fc3d90d.jpg",
      "isVisible":1,
      "order":1,
      "title":"公众号文章列表强势上线",
      "type":1,
      "url":"http://www.wanandroid.com/wxarticle/list/408/1"
    },
    {
      "desc":"",
      "id":2,
      "imagePath":"https://www.wanandroid.com/blogimgs/90cf8c40-9489-4f9d-8936-02c9ebae31f0.png",
      "isVisible":1,
      "order":2,
      "title":"JSON工具",
      "type":1,
      "url":"http://www.wanandroid.com/tools/bejson"
    },
  ],
  "errorCode":0,
  "errorMsg":""
}

运行flutter packages pub run json_model生成model示例

import 'package:json_annotation/json_annotation.dart';

part 'banner.g.dart';

@JsonSerializable()
class Banner {
    Banner();

    List data;
    num errorCode;
    String errorMsg;
    
    factory Banner.fromJson(Map<String,dynamic> json) => _$BannerFromJson(json);
    Map<String, dynamic> toJson() => _$BannerToJson(this);
}

yangchong211 avatar Jun 13 '19 03:06 yangchong211

我也碰到这个问题了,有解决方法么?

vaezc avatar Jun 13 '19 07:06 vaezc

这个不适用于嵌套的,只能把data里面的类单独拆出来,搞个item.json文件,然后data那里写"data": "$[]item"

tianyu704 avatar Jun 18 '19 09:06 tianyu704

这个不适用于嵌套的,只能把data里面的类单独拆出来,搞个item.json文件,然后data那里写"data": "$[]item"

但是生成的代码不会自动解析 JSON 好像,还得手动修改 *.g.dart 文件才行。比如:

// AuthorModel.dart
@JsonSerializable()
class AuthorModel {
    AuthorModel();

    String id;
    String username;
    Url avatarUri;
    List<LabelModel> labelStructs;
    
    factory AuthorModel.fromJson(Map<String,dynamic> json) => _$AuthorModelFromJson(json);
    Map<String, dynamic> toJson() => _$AuthorModelToJson(this);
}

生成的 AuthorModel.g.dart

AuthorModel _$AuthorModelFromJson(Map<String, dynamic> json) {
  return AuthorModel()
    ..id = json['id'] as String
    ..username = json['username'] as String
    ..avatarUri = json['avatarUri']
    ..labelStructs = json['labelStructs'] as List;
}

Map<String, dynamic> _$AuthorModelToJson(AuthorModel instance) =>
    <String, dynamic>{
      'id': instance.id,
      'username': instance.username,
      'avatarUri': instance.avatarUri,
      'labelStructs': instance.labelStructs
    };

labelStructs 属性不会调用 LabelModel.fromJson 进行解析,而是直接把 JSON 放进来了,这样好像有问题 :(

LeeYunhang avatar Nov 25 '19 12:11 LeeYunhang