dart中json和对象互转

简介: 开发过程中,json是必不可少的基础技能之一。这里记录下,在Dart语言中,如何将json解析成实例对象,以及如何将实例对象转化成json字符串。

开发过程中,json是必不可少的基础技能之一。这里记录下,在Dart语言中,如何将json解析成实例对象,以及如何将实例对象转化成json字符串。

这里使用的工具是dart:convert包。

我们的目的很简单,待解析的json字符串格式如下:

{
"key":"wangdandan",
"value":"王蛋蛋的father"
}

json字符串解析成实例对象

1、创建model对象
class JsonModelDemo {
  String key;
  String value;
}
2、将实体类对象解析成json字符串。

我们创建一个实例对象,然后给这个实例对象赋值,接着使用jsonDecode方法解析实例对象。代码如下,

import 'dart:convert';

import 'package:dart_demo1/json/json_model.dart';

///  将实体类对象解析成json字符串
String generatePlatformJson({String key, String value}) {
  JsonModelDemo jsonModelDemo = new JsonModelDemo();
  jsonModelDemo.key = key;
  jsonModelDemo.value = value;
  String jsonStr = jsonEncode(jsonModelDemo);
  return jsonStr;
}

/// 这里写测试方法
main() {
  String result1 = generatePlatformJson(key: "result1", value: "result1Value");
  print('result1:$result1');
}

执行代码,报错如下:


lib/json/json_parse_util.dart:1: Warning: Interpreting this as package URI, 'package:dart_demo1/json/json_parse_util.dart'.
Unhandled exception:
Converting object to an encodable object failed: Instance of 'JsonModelDemo'
#0      _JsonStringifier.writeObject (dart:convert/json.dart:645:7)
#1      _JsonStringStringifier.printOn (dart:convert/json.dart:832:17)
#2      _JsonStringStringifier.stringify (dart:convert/json.dart:817:5)
#3      JsonEncoder.convert (dart:convert/json.dart:253:30)
#4      JsonCodec.encode (dart:convert/json.dart:164:45)
#5      jsonEncode (dart:convert/json.dart:76:10)
#6      generatePlatformJson (package:dart_demo1/json/json_parse_util.dart:10:20)
#7      main (package:dart_demo1/json/json_parse_util.dart:16:20)
#8      _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:300:19)
#9      _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)

Process finished with exit code 255

查找Converting object to an encodable object failed: Instance of 'xxx'这个错误,在stackoverflow上找到答案:https://stackoverflow.com/questions/27739434/dart-object-json-string-failing-to-convert-to-json

我们给model实体类添加toJson方法:

class JsonModelDemo {
  String key;
  String value;

  /// jsonDecode(jsonStr) 方法中会调用实体类的这个方法。如果实体类中没有这个方法,会报错。
  Map toJson() {
    Map map = new Map();
    map["key"] = this.key;
    map["value"] = this.value;
    return map;
  }
}

这次再运行代码,解析成功,输出如下:

result1:{"key":"result1","value":"result1Value"}

实例对象转化成json字符串

解析代码如下:

/// 将json字符串解析成实体类对象
JsonModelDemo parsePlatformJson(String jsonStr) {
  JsonModelDemo result = jsonDecode(jsonStr);
  return result;
}

测试代码如下:

JsonModelDemo modelDemo = parsePlatformJson(result1);
  print('parsePlatformJson:$modelDemo');

为了方便测试,在JsonModelDemo中重写toString方法;

@override
String toString() {
return 'JsonModelDemo{key: $key, value: $value}';
}

运行代码,报错如下:

Unhandled exception:
type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'JsonModelDemo'
#0      parsePlatformJson (package:dart_demo1/json/json_parse_util.dart:16:17)
#1      main (package:dart_demo1/json/json_parse_util.dart:25:29)
#2      _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:300:19)
#3      _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)

仔细观察报错,发现是类型不匹配,具体原因是jsonDecode方法返回的是Map<String, dynamic>,不是我们期望的实例对象。所以,我们还需要将Map<String, dynamic>转化为我们想要的实例对象。

在model中添加转化方法:

/// jsonDecode(jsonStr)方法返回的是Map<String, dynamic>类型,需要这里将map转换成实体类
static JsonModelDemo fromMap(Map<String, dynamic> map) {
    JsonModelDemo jsonModelDemo = new JsonModelDemo();
    jsonModelDemo.key = map['key'];
    jsonModelDemo.value = map['value'];
    return jsonModelDemo;
}

接着修改解析方法:

/// 将json字符串解析成实体类对象
JsonModelDemo parsePlatformJson(String jsonStr) {
  JsonModelDemo result = JsonModelDemo.fromMap(jsonDecode(jsonStr));
  return result;
}

运行代码,解析成功,输出如下:

result1:{"key":"result1","value":"result1Value"}
parsePlatformJson:JsonModelDemo{key: result1, value: result1Value}

参考:

https://stackoverflow.com/questions/27739434/dart-object-json-string-failing-to-convert-to-json

https://www.dartlang.org/guides/libraries/library-tour#dartconvert---decoding-and-encoding-json-utf-8-and-more

https://medium.com/flutter-community/parsing-complex-json-in-flutter-747c46655f51

相关文章
|
19天前
|
Web App开发 JSON JavaScript
SAP UI5 应用程序小技巧 - 一键将 JSON 对象导出成本地 json 文件
SAP UI5 应用程序小技巧 - 一键将 JSON 对象导出成本地 json 文件
33 0
|
19天前
|
JSON 应用服务中间件 nginx
钉钉获取用户token返回的body为空json对象,可能有以下几种情况
钉钉获取用户token返回的body为空json对象,可能有以下几种情况【1月更文挑战第5天】【1月更文挑战第25篇】
41 5
|
19天前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
79 0
|
19天前
|
JSON JavaScript 数据格式
JS 将 json 对象转成字符串并保留格式 - JSON.stringify()
JS 将 json 对象转成字符串并保留格式 - JSON.stringify()
70 0
|
17天前
|
JSON NoSQL MongoDB
实时计算 Flink版产品使用合集之要将收集到的 MongoDB 数据映射成 JSON 对象而非按字段分割,该怎么操作
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
17天前
|
JSON 前端开发 JavaScript
前端 JS 经典:JSON 对象
前端 JS 经典:JSON 对象
19 0
|
17天前
|
JSON JavaScript 前端开发
js将json字符串还原为json对象
【5月更文挑战第14天】js将json字符串还原为json对象
45 1
|
19天前
|
JSON 数据格式
JSON对象相互转换
JSON对象相互转换
16 3
|
19天前
|
JSON Java 数据处理
Spring Boot与Jsonson对象:灵活的JSON操作实战
【4月更文挑战第28天】在现代Web应用开发中,JSON数据格式的处理至关重要。假设 "Jsonson" 代表一个类似于Jackson的库,这样的工具在Spring Boot中用于处理JSON。本篇博客将介绍Spring Boot中处理JSON数据的基本概念,并通过实际例子展示如何使用类似Jackson的工具进行数据处理。
34 0
|
19天前
|
JSON C语言 数据格式
C语言与lua通过json对象交互
C语言与lua通过json对象交互
24 1