在Dart Flutter中自动将JSON转换为对象

8

我在谷歌和stackoverflow上搜索了一些自动转换库,但并没有像C#那样的库。

我需要在Dart-Flutter中找到这段C#代码的替代方法。

    string jsonTokenData = "{my token json data}";
    TokenModel getTokenModel = Newtonsoft.Json.JsonConvert.DeserializeObject<GetTokenModel>(jsonTokenData);

更新

  • 我已经阅读了文档,并知道如何将模型与json映射
  • 这个问题是针对那些熟悉C#上Newtonsoft库工作方式的人
  • 如果你不知道Newtonsoft:想法是自动将json数据转换为模型,而无需为每个模型编写映射。我知道还有一种工具可以自动创建每个模型的json映射,但这样会使代码变得荒谬。

第二次更新:由于社区给出的类似问题的建议并没有回答我的问题,因此这是另一个解释:

我有很多模型,这些模型根据客户要求进行更新,或向某些模型添加新功能。所以当发生更新时,我只需要添加已添加到这些模型中的额外属性,而无需每次担心映射、拼写错误或再次使用某些工具来重新生成这些代码。

所以我正在寻找一个函数,它需要两个参数:

  • 第一个参数是模型的类型
  • 第二个参数是保存数据的json字符串

[然后返回传递类型的对象实例]

举个简单的例子,如果我有这个类:

class Car {
    String name;
    String type;
}

那么我可以这样保持它的清洁,而不会因使用其他方法使其弄脏:
Car({
        this.name,
        this.type,
    });

    factory Car.fromJson(Map<String, dynamic> json) => Car(
        name: json["name"],
        type: json["type"],
    );

    Map<String, dynamic> toJson() => {
        "name": name,
        "type": type,
    };

顺便提一下,C#中的lib还可以处理数组、列表和嵌套类。

希望这次解释得更清楚了。


你能回复一下我的评论吗?我已经理解了你的C#方法在做什么,但我想知道我提出的方法有什么问题以及如何解决。 - Christopher Moore
这是一个用于C# .net的库,它可以自动创建给定类型<GetTokenModel>的实例并检索其属性,然后从JSON字符串中获取数据并将其与检索到的实例一起返回。 - Abdu Imam
它是如何自动完成这个过程的?如果JSON中包含的属性与对象的字段不匹配怎么办?这个结果与我的答案有什么不同之处?请查看我的答案。 - Christopher Moore
我最近添加了这个包 https://pub.dev/packages/jsonize,你可以在自己的数据类中实现Jsonizable接口,然后你的对象就可以放在任何数据结构中。 - cabbi
2
Flutter仍然没有自动JSON解析的方法。期待类似于Newtonsoft的Flutter库。在初始化和解析模型类时需要太多的代码,这应该改变。 - Prashant Gupta
显示剩余6条评论
3个回答

2
我已经为Jsonize添加了一个新的Dart包,可在任何数据结构中自定义类。

这是您的汽车示例的样子:

import 'package:jsonize/jsonize.dart';

class Car implements Jsonizable<Car> {
  final String name;
  final String type;
  Car({required this.name, required this.type});

  // Jsonizable implementation
  factory Car.empty() => Car(name: "", type: "");

  @override
  String get jsonClassCode => "car";

  @override
  Map<String, dynamic> toJson() => {"name": name, "type": type};

  @override
  Car? fromJson(value) => Car(name: value["name"], type: value["type"]);
}

void main() {
  // Register classes
  Jsonize.registerClass(Car.empty());

  // Now you can jsonize it wherever
  Map<String, dynamic> myMap = {
    "my_car": Car(name: "Jessie", type: "Tesla"),
    "purchase_dt": DateTime.now(),
  };
  var jsonRep = Jsonize.toJson(myMap);
  var hereIsMyMap = Jsonize.fromJson(jsonRep);
  print(hereIsMyMap);

  List<dynamic> myList = [
    Car(name: "Jessie", type: "Tesla"),
    Car(name: "Bob", type: "Ford"),
  ];
  jsonRep = Jsonize.toJson(myList);
  var hereIsMyList = Jsonize.fromJson(jsonRep);
  print(hereIsMyList);
}

-1

只需像这样导入dart:convert库

 import 'dart:convert';

然后使用这段代码:

json.decode(json)

请查看此链接:dart:convert库


-2

做一些研究可以让你不必在SO上提问。

JSON解码在flutter网站上有很好的文档。它指向使用jsonDecode函数,该函数解析String并返回结果JSON对象。

String jsonTokenData = "{my token json data}";
dynamic json = jsonDecode(jsonTokenData);

您可以将解码后的对象传递给自定义构造函数,例如 .fromJson,它接受一个 Map/List,具体取决于您的 JSON 数据。

如果因为某些原因创建一个接受 JSON 数据的构造函数会太麻烦/太多打字,或者如果您自己做起来有困难,您可以使用像 this 这样的 JSON 到 Dart 服务。


@AbduImam 这有什么不同吗?Newtonsoft.Json.JsonConvert.DeserializeObject<GetTokenModel>(jsonTokenData);除了您可以指定要反序列化的对象之外,它执行的是完全相同的操作。在Dart中无法选择要反序列化的对象。除了使用jsonDecode之外,创建一个自定义构造函数是从JSON创建对象的唯一方法。 - Christopher Moore
是的,我们仍然需要进行映射,这就是我需要避免的。所以我想问是否有一个库可以做到这一点,或者有人可以使用像C#的dot net框架中的System.Reflection这样的工具创建动态映射。 - Abdu Imam
@AbduImam我仍然不清楚它们之间的区别。您应该尝试用通用术语或Dart术语来表达您想要做的事情,因为并不一定有大量的开发人员可以回答您的问题,并且他们精通Dart和C#。 - Christopher Moore
是的,我更新了我的问题,解释了Newtonsoft的工作方式。 - Abdu Imam
@AbduImam 那么Newtonsoft在内部是如何做到这一点的呢?它对JSON数据进行了什么处理,使其能够将数据归属于某些属性?为什么创建一个构造函数来处理jsonDecode返回的内容会成为问题? - Christopher Moore
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接