如何在Flutter中解码JSON?
问题很简单,但答案至少对我来说不是。
我有一个使用大量JSON字符串的项目。基本上,应用程序和服务器之间的整个通信都是通过JSON。
我一直在使用JSON.decode(json_string)
来处理它,但是今天我更新了Flutter核心(0.5.8-pre.178),并且JSON.decode不再可用。
我去Flutter Docs寻求帮助,但仍然说要使用JSON.decode。
那么,从现在开始如何在Flutter中解码JSON?
答案 0 :(得分:16)
只需使用
json.decode()
或
jsonDecode()
在Dart 2中,所有尖叫情况下的常量都更改为小写驼峰。
答案 1 :(得分:14)
您将需要导入dart:convert
:
import 'dart:convert';
String rawJson = '{"name":"Mary","age":30}';
Map<String, dynamic> map = jsonDecode(rawJson); // import 'dart:convert';
String name = map['name'];
int age = map['age'];
Person person = Person(name, age);
注意:在服务器端Dart的VS Code中执行此操作时,我必须指定类型:
Map<String, dynamic> map = jsonDecode(rawJson) as Map<String, dynamic>;
模型类包含地图转换逻辑:
class Person {
String name;
int age;
Person(this.name, this.age);
// named constructor
Person.fromJson(Map<String, dynamic> json)
: name = json['name'],
age = json['age'];
// method
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
};
}
}
JSON转换是这样完成的:
String rawJson = '{"name":"Mary","age":30}';
Map<String, dynamic> map = jsonDecode(rawJson);
Person person = Person.fromJson(map);
查看我的完整答案here。
编写序列化代码时很容易出错,因此通常建议使用Dart团队的json_serializable软件包。但是,您可以了解不同方法here的优缺点。
如果您想要更多选项,还可以签出built_value软件包。
答案 2 :(得分:2)
您需要使用import 'dart:convert';
解码:
JsonDecoder().convert("$response");
编码:
JsonEncoder().convert(object)
答案 3 :(得分:1)
用于解码这样的Json
{
"id":"xx888as88",
"timestamp":"2020-08-18 12:05:40",
"sensors":[
{
"name":"Gyroscope",
"values":[
{
"type":"X",
"value":-3.752716,
"unit":"r/s"
},
{
"type":"Y",
"value":1.369709,
"unit":"r/s"
},
{
"type":"Z",
"value":-13.085,
"unit":"r/s"
}
]
}
]
}
我这样做:
void setReceivedText(String text) {
Map<String, dynamic> jsonInput = jsonDecode(text);
_receivedText = 'ID: ' + jsonInput['id'] + '\n';
_receivedText += 'Date: ' +jsonInput['timestamp']+ '\n';
_receivedText += 'Device: ' +jsonInput['sensors'][0]['name'] + '\n';
_receivedText += 'Type: ' +jsonInput['sensors'][0]['values'][0]['type'] + '\n';
_receivedText += 'Value: ' +jsonInput['sensors'][0]['values'][0]['value'].toString() + '\n';
_receivedText += 'Type: ' +jsonInput['sensors'][0]['values'][1]['type'] + '\n';
_receivedText += 'Value: ' +jsonInput['sensors'][0]['values'][1]['value'].toString() + '\n';
_receivedText += 'Type: ' +jsonInput['sensors'][0]['values'][2]['type'] + '\n';
_receivedText += 'Value: ' +jsonInput['sensors'][0]['values'][2]['value'].toString();
_historyText = '\n' + _receivedText;
}
我是Flutter的新手,所以现在为我工作
答案 4 :(得分:0)
可以使用几种不同的方法来解析JSON代码。这是它们的两个小示例: JSON只是大多数REST API用于返回其数据的一种文本格式。
Dart具有对JSON解析的内置支持。给定一个字符串,您可以使用dart:convertlibrary
并将JSON(如果有效的JSON)转换为带有字符串键和动态对象的Map。您可以直接解析JSON并使用地图,也可以解析JSON并将其放入类型化的对象中,从而使数据具有更多的结构并更易于维护。
假设我们需要解析此JSON数据:
final jsonData = {
"name": "John",
"age": 20
}
注意: Use json.decode(jsonData)
,将JSON字符串转换为地图。
直接解析和使用:
您可以使用dart:convert
库手动解析JSON字符串。
var parsedJson = json.decode(jsonData);
print('${parsedJson.runtimeType} : $parsedJson');
//The code above will give you
_InternalLinkedHashMap<String, dynamic> : {name: John, age: 20}
因此,访问已解析数据的方式是使用返回的映射上的键索引。让我们进入地图索引,获取名称和年龄。
import 'dart:convert';
void testParseJsonDirect() {
var name = parsedJson['name'];
var age = parsedJson['age'];
print('$name is $age');
}
这看起来并不难,但是如果您开始使用复杂的JSON字符串,那么编写和维护将变得非常繁琐。
解析JSON对象
我们创建一个Student类并进行解析,然后将解码后的JSON传递给工厂构造函数:
class Student {
final String name;
final int age;
Student({this.name, this.age});
factory Student.fromJson(Map<String, dynamic> json) {
return Student(name: json['name'], age: json['age']);
}
// Override toString to have a beautiful log of student object
@override
String toString() {
return 'Student: {name = $name, age = $age}';
}
}
使用dart:convert
解析JSON。在这里,我使用“原始字符串”来表示JSON文本。如果您不了解“原始字符串”,则可以在Dart/Flutter – Things you should know中的字符串中检查点4和点5。
void testParseJsonObject() {
final jsonString = r'''
{
"name": "John",
"age": 20
}
''';
// Use jsonDecode function to decode the JSON string
// I assume the JSON format is correct
final json = jsonDecode(jsonString);
final student = Student.fromJson(json);
print(student);
}
测试
void main(List<String> args) {
testParseJsonObject();
}
// Output
Student: {name = John, age = 20}
答案 5 :(得分:0)
您可以将 JSON strings
、lists
和 maps
直接解码为对象或对象列表。
这可以通过包 json_helpers
实现。
import 'package:json_helpers/json_helpers.dart';
例如,只需调用一个方法,您就可以将请求 (String
) 的 request.body
结果直接转换为对象列表,而不会太麻烦。
详细示例:
String
到 Post
final text = '{"title": "Hello"}';
final post = text.json((e) => Post.fromJson(e));
print(post.title);
String
到 List<Post>
final text = '[{"title": "Hello"}, {"title": "Goodbye"}]';
final post = text.jsonList((e) => Post.fromJson(e));
print(post[0].title);
Map
到 Post
final map = {"title": "Hello"};
final post = map.json((e) => Post.fromJson(e));
print(post.title);
List<Map>
到 List<Post>
final list = [{"title": "Hello"}, {"title": "Goodbye"}];
final post = list.json((e) => Post.fromJson(e));
print(post[0].title);