如何在Dart Flutter中将JSON字符串转换为JSON对象?

64

我有这样一个字符串:

{id:1, name: lorem ipsum, address: dolor set amet}

我需要将该字符串转换为JSON,在Dart Flutter中我该如何实现?非常感谢您的帮助。

8个回答

84

你需要使用json.decode。它接受一个JSON对象并允许您处理嵌套的键值对。我将为您编写一个示例。

import 'dart:convert';

// actual data sent is {success: true, data:{token:'token'}}
final response = await client.post(url, body: reqBody);

// Notice how you have to call body from the response if you are using http to retrieve json
final body = json.decode(response.body);

// This is how you get success value out of the actual json
if (body['success']) {
  //Token is nested inside data field so it goes one deeper.
  final String token = body['data']['token'];

  return {"success": true, "token": token};
}

12
这并没有回答提问者的问题。你只是解释了如何从实际的 JSON 中访问键值对。 - VipiN Negi
1
问题对象不包含引号,解码将失败。 - Jason Pascoe

10
创建一个模型类。
class User {
  int? id;
  String? name;
  String? address;

  User({this.id, this.name, this.address});

  User.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    name = json['name'];
    address = json['address'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['name'] = this.name;
    data['address'] = this.address;
    return data;
  }
}

在逻辑部分

    String data ='{id:1, name: lorem ipsum, address: dolor set amet}';

    var encodedString = jsonEncode(data);

    Map<String, dynamic> valueMap = json.decode(encodedString);
   
    User user = User.fromJson(valueMap);

还需要导入

导入 'dart:convert';


我使用了这个解决方案,但是我只调用了 json.decode 然后调用 User.fromJson 来正确地解析成对象。希望这能帮助其他人。 - Nick N

5
你可以按以下方式将JSON数组转换为对象列表:
String jsonStr = yourMethodThatReturnsJsonText();
Map<String,dynamic> d  = json.decode(jsonStr.trim());
List<MyModel> list = List<MyModel>.from(d['jsonArrayName'].map((x) => MyModel.fromJson(x)));

我的模型 MyModel 大致如下:

class MyModel{

  String name;
  int age;

  MyModel({this.name,this.age});

  MyModel.fromJson(Map<String, dynamic> json) {
    name= json['name'];
    age= json['age'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['name'] = this.name;
    data['age'] = this.age;

    return data;
  }
}

我们如何使用这个 toJson 函数? - Kamlesh
@Kamlesh 你可以这样访问:MyModel model = new MyModel(...); final json = model.toJson(); - Mohsen Emami
因为toJson()是工厂类型函数,所以它会起作用吗?欢迎任何建议。谢谢。 - Kamlesh
我有一个类似于 userinfo = { 'name': , 'phonenumber': '9829098290', 'city': 'california' } 的映射表。如果我将它传递给我的模型,例如 User.fromJson(userinfo),它就无法正常工作。我知道 name 字段为空。请建议如何使用它来创建模型类型值,例如 User.nameUser.phonenumberUser.city。谢谢。 - Kamlesh

3
 String name =  "{click_action: FLUTTER_NOTIFICATION_CLICK, sendByImage: https://ujjwalchef.staging-server.in/uploads/users/1636620532.png, status: done, sendByName: mohittttt, id: HM11}";
  List<String> str = name.replaceAll("{","").replaceAll("}","").split(",");
  Map<String,dynamic> result = {};
  for(int i=0;i<str.length;i++){
    List<String> s = str[i].split(":");
    result.putIfAbsent(s[0].trim(), () => s[1].trim());
  }
  print(result);
}

2

有时候你必须使用这个

Map<String, dynamic> toJson() {
  return {
    jsonEncode("phone"): jsonEncode(numberPhone),
    jsonEncode("country"): jsonEncode(country),

 };
}

这段代码会给你一个类似的字符串:{"numberPhone":"+225657869", "country":"CI"}。所以很容易解码,方法如下:

     json.decode({"numberPhone":"+22565786589", "country":"CI"})

尽管此代码可能解决问题,但包括解释如何以及为什么解决问题将有助于提高您的帖子质量,可能会得到更多点赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加说明,并指出适用的限制和假设。 - rizerphe

1
value = "{"id":0,"customerId":null,"title":"title"}";   
var response = jsonDecode(value);
print(response['title']);

请记住,Stack Overflow 不仅旨在解决当前的问题,还要帮助未来的读者找到类似问题的解决方案,这需要理解底层代码。对于我们社区中的初学者和不熟悉语法的成员来说,这尤其重要。鉴于此,您能否编辑您的答案,包括您正在做什么以及为什么您认为这是最好的方法的解释 - Jeremy Caney

0

将字符串转换为JSON,我们必须使用自定义逻辑进行修改,在这里首先我们删除所有数组和对象符号,然后使用特殊字符拆分文本,并附加键和值(用于映射)。 请在dartpad.dev中尝试此代码片段。

import 'dart:developer';

void main() {
  String stringJson = '[{product_id: 1, quantity: 1, price: 16.5}]';

  stringJson = removeJsonAndArray(stringJson);

  var dataSp = stringJson.split(',');
  Map<String, String> mapData = {};
  for (var element in dataSp) {
    mapData[element.split(':')[0].trim()] = element.split(':')[1].trim();
  }

  print("jsonInModel: ${DemoModel.fromJson(mapData).toJson()}");
}

String removeJsonAndArray(String text) {
  if (text.startsWith('[') || text.startsWith('{')) {
    text = text.substring(1, text.length - 1);
    if (text.startsWith('[') || text.startsWith('{')) {
      text = removeJsonAndArray(text);
    }
  }
  return text;
}

class DemoModel {
  String? productId;
  String? quantity;
  String? price;

  DemoModel({this.productId, this.quantity, this.price});

  DemoModel.fromJson(Map<String, dynamic> json) {
    log('json: ${json['product_id']}');
    productId = json['product_id'];
    quantity = json['quantity'];
    price = json['price'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['product_id'] = productId;
    data['quantity'] = quantity;
    data['price'] = price;
    return data;
  }
}

0

1
我尝试了这个:Map res = jsonDecode(sharedPreferences.getString('jsonString')); 但是我得到了这个错误:FormatException (FormatException: 意外字符。 - Ashtav
一个 Map 是动态的独立的。 - Ernesto Campohermoso

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