如果将来添加任何键,json 如何解析颤振中的动态键和值

如何解决如果将来添加任何键,json 如何解析颤振中的动态键和值

我收到了最初获得不同形状属性的响应。

{
    "success": true,"data": {
         "pcode": "001","pname": "ABC","pprice": "100"
        "ones": [{
                "id": "2","username": "LM10002"
            },{
                "id": "6","username": "LM10006"
            }
        ],"twos": [{
                "id": "3","username": "LM10003"
            },{
                "id": "8","username": "LM10008"
            }
        ],]
    }
}

这里的“ones”、“twos” .. 是动态键,将来也添加新数组。 所以我们可以在颤振中动态管理它?

解决方法

我的第一个建议是使用数字而不是字符串来转换这些数据,所以无论标签(onestwos 等...)在未来发生变化,它都赢了不会影响您的代码。

void main() {
  final data = { 
    "success": true,"data": { 
      "ones": [
        { "id": "2","username": "LM10002" },{ "id": "6","username": "LM10006" } 
      ],"twos": [
        { "id": "3","username": "LM10003" },{ "id": "8","username": "LM10008" } 
      ] 
    }
  };

  print(ApiResponse.fromJson(data));
}

class ApiResponse {
  final bool success;
  final List<List<Data>> data; 
  
  ApiResponse({this.success,this.data});
  
  factory ApiResponse.fromJson(Map<String,dynamic> json) {
    
    List<List<Data>> dataList = [];
    final jsonData = (json["data"] as Map<String,dynamic>);
    jsonData.values.forEach((value) {
      List<Data> parsedList = List<Data>.from(List.from(value).map((element) => Data.fromJson(element)));
      dataList.add(parsedList);
    });
      
    return ApiResponse(
      success: json["success"],data: dataList,);
  }
  

  @override
  String toString() {
     return "Success: $success,Data: ${data.map((element) => element.map((d) => "${d.id} ${d.username}")).toList().join("; ")}";
  }
}

class Data {
  final String id;
  final String username;
  
  Data({this.id,this.username});
  
  factory Data.fromJson(Map<String,dynamic> json) {
    return Data(
      id: json["id"],username: json["username"],);
  }
}

这应该返回一个数据列表,其中每个 index+1 将代表顺序(一个或两个,等等),并且附加的值将直接是数据列表。

主函数中的打印语句将打印:Success: true,Data: (2 LM10002,6 LM10006); (3 LM10003,8 LM10008)

第二种方法是为每个数据添加一个 group 属性,以便对于每个数据,您知道它属于哪个组(ones、twos 等...)

这是完整的实现

void main() {
  final data = { 
    "success": true,"username": "LM10008" } 
      ] 
    }
  };

  print(ApiResponse.fromJson(data));
}

class ApiResponse {
  final bool success;
  final List<Data> data; 
  
  ApiResponse({this.success,dynamic> json) {
    
    List<Data> dataList = [];
    final jsonData = (json["data"] as Map<String,dynamic>);
    jsonData.forEach((key,value) {
      List<Data> parsedList = List<Data>.from(List.from(value).map((element) { 
        element["group"] = key;
        return Data.fromJson(element);
      }));
      dataList.addAll(parsedList);
    });
      
    return ApiResponse(
      success: json["success"],);
  }

  @override
  String toString() {
     return "Success: $success,Data: ${data.map((element) => "${element.id},${element.username},${element.group}")}";
  }
}

class Data {
  final String id;
  final String username;
  final String group;
  
  Data({this.id,this.username,this.group});
  
  factory Data.fromJson(Map<String,group: json["group"]
    );
  }
}

main 方法中的打印语句应该打印:Success: true,Data: (2,LM10002,ones,6,LM10006,3,LM10003,twos,8,LM10008,twos)

总而言之,第一个解决方案建议以矩阵的形式表示数据,纵坐标为数据“组”的索引 1,横坐标为数据本身。

优点:我们保持数据的顺序并且很容易对它们进行排序 缺点:可读性不好,API返回的组标签是

第二种方法允许将标签保留为字符串并将它们添加到数据中(以便稍后根据组自动过滤数据)。

优势:我们保留初始数据组标签 缺点:排序会比较困难。

希望我提出的其中一种解决方案可以帮助到您。如果您需要更多说明,请随时告诉我。

快乐编码!

,

您可以创建一个类来处理这种响应。您将能够访问分配给数据键的地图的不同键并对其执行任何您想要的操作。

OpenSSLEngineFactory

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?