如何在Flutter中解码JSON?

Not*_*ros 19 json flutter

如何在Flutter中解码JSON?

问题很简单,但答案不是,至少对我而言.

我有一个使用大量JSON字符串的项目.基本上,应用程序和服务器之间的整个通信都是通过JSON进行的.

我一直在使用JSON.decode(json_string)它来处理它,但今天我更新了Flutter核心(0.5.8-pre.178)并且JSON.decode不再可用.

我去了Flutter Docs寻求帮助,但它仍然说要使用JSON.decode.

那么,从现在开始如何在Flutter中解码JSON?

Sur*_*gch 29

您将需要导入dart:convert:

import 'dart:convert';
Run Code Online (Sandbox Code Playgroud)

内联示例

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);
Run Code Online (Sandbox Code Playgroud)

注意:在服务器端Dart的VS Code中执行此操作时,必须指定类型:

Map<String, dynamic> map = jsonDecode(rawJson) as Map<String, dynamic>;
Run Code Online (Sandbox Code Playgroud)

模型类示例

模型类包含地图转换逻辑:

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,
    };
  }

}
Run Code Online (Sandbox Code Playgroud)

JSON转换是这样完成的:

String rawJson = '{"name":"Mary","age":30}';
Map<String, dynamic> map = jsonDecode(rawJson);
Person person = Person.fromJson(map);
Run Code Online (Sandbox Code Playgroud)

在这里查看我的完整答案。

生成序列化代码

编写序列化代码时很容易出错,因此通常建议Dart团队使用json_serializable软件包。但是,您可以在此处了解不同方法的优缺点。

如果需要更多选项,还可以签出built_value软件包。

也可以看看


Gün*_*uer 26

只是用

json.decode()
Run Code Online (Sandbox Code Playgroud)

要么

jsonDecode()
Run Code Online (Sandbox Code Playgroud)

在Dart 2中,所有尖叫案例常数都改为低骆驼案.


San*_*inh 12

你需要使用 import 'dart:convert';

解码: JsonDecoder().convert("$response");

编码: JsonEncoder().convert(object)


小智 6

对于这样的 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"
         }
       ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我这样做:

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;
}
Run Code Online (Sandbox Code Playgroud)

我是 Flutter 新手,所以现在就为我工作