如何在Flutter中解码JSON?

时间:2018-07-30 20:05:17

标签: json flutter

如何在Flutter中解码JSON?

问题很简单,但答案至少对我来说不是。

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

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

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

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

6 个答案:

答案 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}

答案来自:https://coflutter.com/dart-flutter-how-to-parse-json/

答案 5 :(得分:0)

您可以将 JSON stringslistsmaps 直接解码为对象或对象列表。

这可以通过包 json_helpers 实现。

import 'package:json_helpers/json_helpers.dart';

例如,只需调用一个方法,您就可以将请求 (String) 的 request.body 结果直接转换为对象列表,而不会太麻烦。

详细示例:

StringPost

  final text = '{"title": "Hello"}';
  final post = text.json((e) => Post.fromJson(e));
  print(post.title);

StringList<Post>

  final text = '[{"title": "Hello"}, {"title": "Goodbye"}]';
  final post = text.jsonList((e) => Post.fromJson(e));
  print(post[0].title);

MapPost

  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);