在Dart中使用JSON.decode()从JSON字符串实例化类

4

通过浏览我成功地创建了一个类,可以通过公开一个 Map toJson() 方法来 "opt in" dat:convert,并且可以通过 JSON.encode(myClass) 进行 json-ify,更或者像下面这样:

//My dummy class
class MyClass{
  String p1;
  String p2;

  Map toJson{
    return {
      'p1':this.p1,
      'p2':this.p2
    }
  }
}

//so I can do
String jsonString = JSON.encode(myClass)

然而我想反过来做这个,比如:

String jsonString = '{"p1":"value","p2":"value"}'
MyClass instance = JSON.decode(jsonString)

但是到目前为止,我还没有找到解决方法。我知道我可以为我的类构建一个构造函数,从map中初始化它,例如:

String jsonString = '{"p1":"value","p2":"value"}'
MyClass instance = MyClass.fromMap(JSON.decode(jsonString))

然而,我正在寻找一种更“对称”的方法,只使用JSON.encode()和JSON.decode(),这是否可行?我有什么遗漏的吗?


JSON.decode 放在构造函数里隐藏怎么样?而且我认为最好显式地调用 toJson(),因为如果它抛出异常,它不会出现在堆栈跟踪中(我不知道为什么)。 - Adamovskiy
1
当然我可以这样做,但我的问题更多是想知道为什么我可以通过暴露toJson()来选择JSON.encode(),而不是反过来。 - dev_mush
1个回答

1
没有标准的方法来在JSON中编码类。 {"p1":"value","p2":"value"} 不包含任何关于要实例化哪个类的信息。也没有标准的方法从字符串创建一个新类(当几个库都包含同名类时应该使用哪个库...)
据我所知,可以使用reviver来实现这个目的。
reviver(var key, var value) {
  // decode manually
}
final jsonDecoder = new JsonDecoder(reviver);

但是,复苏者需要一些硬编码逻辑来识别 JSON 应该生成什么 Dart 类以及如何实例化它并从 JSON 初始化属性。

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