颤振创建json或添加列表映射

颤振创建json或添加列表映射,json,list,flutter,Json,List,Flutter,我正在尝试创建一个自定义json,通过android java,我可以使用json对象和json数组,但在Flatter中找不到它们。我创建了列表,但当我添加数据时,它会更改所有索引 List<Map<String,String>> myList=[]; Map<String,String> mymap; for(int i=0;i<5;i++){ mymap['name']='test'+i.toString(); myList.add(mym

我正在尝试创建一个自定义json,通过android java,我可以使用json对象和json数组,但在Flatter中找不到它们。我创建了列表,但当我添加数据时,它会更改所有索引

    List<Map<String,String>> myList=[];
Map<String,String> mymap;
for(int i=0;i<5;i++){
mymap['name']='test'+i.toString();
myList.add(mymap);
print(myList[0]);// its always change test0,test1,test2 
}
for (int i=0;i<5;i++){
print(myList[i]); // its write test5,test5,test5,test5,test5 why?
}
List myList=[];
地图我的地图;

对于(inti=0;i当您将变量分配给复杂类时,它传递的是引用而不是值,复杂类是您创建和内置的类,如List、Map…等 在本例中,在您的
列表中
添加相同的
地图
5次, 因为它传递的引用是相同的
Map
被更改了5次。我希望我有意义。 这里有一个例子

   List<Map<String,String>> myList=[];
   
   Map<String,String> mymap; // This created one object in the current scope.
   
   // First iteration , i = 0  
   mymap['name']='test'+i.toString(); // Now mymap = { name: 'test0' };
   myList.add(mymap); // mylist = [mymap];

   // Second iteration , i = 1
   mymap['name'] = 'test'+i.toString(); // Now mymap = { name: 'test1' };. But since you already added the same mymap in myList, now myList = [{ name: 'test1' }
   myList.add(mymap); // This is again adding the same mymap. So mylist = [{ name: 'test1' }, { name: 'test1' }];
 
List myList=[];
Map mymap;//这在当前作用域中创建了一个对象。
//第一次迭代,i=0
mymap['name']='test'+i.toString();//现在mymap={name:'test0'};
添加(mymap);//myList=[mymap];
//第二次迭代,i=1
mymap['name']='test'+i.toString();//现在的mymap={name:'test1'};但是由于您已经在myList中添加了相同的mymap,现在的myList=[{name:'test1'}
添加(mymap);//这是再次添加相同的mymap。因此myList=[{name:'test1'},{name:'test1'}];
//传递解码的json
Map json=jsonDecode(rawJson);
List locations=List.from(json[“locations”].map((x)=>Location.fromJson(x)))
//Location class=>days是一个前置列表,可以在下面反序列化
类位置{
位置({
这个名字,
这几天,
});
字符串名;
列出日期;
工厂位置。fromJson(映射json)=>位置(
名称:json[“名称”],
days:List.from(json[“days”].map((x)=>x)),
);
映射到JSON()=>{
“姓名”:姓名,
“天”:列表.开始(天.映射((x)=>x)),
};
}

您好。尝试添加一些代码并逐行解释。在它的当前状态下,这可能会让OP感到困惑。我添加了一个示例,如果您运行它,您可以看到在第二次打印后,
\u newMap
值发生了变化,但我们不触摸它,而是,
\u myMap
已经发生了变化,同样的事情也发生在您的列表中,您添加了same引用它5次并更改映射。我理解解决方案。为了操作,我要求您更详细地说明您的答案。让我尝试为您编辑您的答案。如果您想要
Map
的新值,可以使用
Map.from()
构造函数,它将另一个
映射
作为参数哦,很抱歉我是stackoverflow的新手。
//pass your decoded json
Map<String, dynamic> json = jsonDecode(rawJson);

List<Location> locations = List<Location>.from(json["locations"].map((x) => Location.fromJson(x)))
//Location class => days is a premitive list and can be deserialized below
class Location {
  Location({
    this.name,
    this.days,
  });

  String name;
  List<int> days;

  factory Location.fromJson(Map<String, dynamic> json) => Location(
    name: json["name"],
    days: List<int>.from(json["days"].map((x) => x)),
  );

  Map<String, dynamic> toJson() => {
    "name": name,
    "days": List<dynamic>.from(days.map((x) => x)),
  };
}