我在 josn.decode(resp) 上收到错误(错误:预期值为"字符串"类型,但在以下情况下得到 'List<dynamic>' 类型的值之一)



这是我试图执行的代码
帮助我解决这个问题。。

我尝试了很多方法来搜索这个问题的解决方案,但我无法解决它。

抛出的错误是

需要类型为"String"的值,但得到类型为"List"的

我的颤振详细信息是:

version: 1.0.0+1
environment:
sdk: ">=2.7.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2  

dio: ^3.0.10
class SearchList extends StatefulWidget {
@override
_SearchListState createState() => _SearchListState();
}

class _SearchListState extends State<SearchList> {
String _url = "https://jsonplaceholder.typicode.com/comments?postId=1";
TextEditingController _textcontroler = TextEditingController();
StreamController _streamController;
Stream _stream;          
JsonCodec codec = new JsonCodec();

_serch() async {
if (_textcontroler.text == null || _textcontroler.text.length == 0) {
return _streamController.add(null);
} else {
try {
Map<String, String> requestheader = {"Accept": "application/json"};
final response = await Dio().get(_url, queryParameters: requestheader);
final jsondata = response.data;
var decoded = json.decode(jsondata);
//here I got error 
/// Error: Expected a value of type 'String', but got one of type 'List<dynamic>'
/// I AM stuck here I was tried by making a class but the error was the same...
print(decoded);
return _streamController.add(decoded);
} catch (e) {
print("Error: $e");
}
}
}

@override
void initState() {
super.initState();
_streamController = StreamController();
_stream = _streamController.stream;
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Item Name"),
bottom: PreferredSize(
preferredSize: Size.fromHeight(40),
child: Row(
children: [
Expanded(
child: Container(
child: TextFormField(
controller: _textcontroler,
onChanged: (String text) {
_serch();
},
decoration: InputDecoration(
hintText: "Enter Item Name",
contentPadding: const EdgeInsets.only(left: 24),
border: InputBorder.none),
),
))
],
),
),
),
body: Container(
child: StreamBuilder(
stream: _stream,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.data == null) {
return Text("Enter Some data");
}
return ListView.builder(
itemCount: snapshot.data["name"].length,
itemBuilder: (BuildContext context, int index) {
var alldata = snapshot.data[index];
return ListTile(
title: alldata["name"],
);
},
);
},
),
),
);
}
}

出现错误的原因是您调用了json.decode,它需要一个json字符串,但您已经有了一个解码的List<dynamic>Dio对您的响应进行内部解码,并将解码后的输出返回给您。

您可以直接使用response.data或键入cast以获得更好的IntelliSense,如下所示:

final jsonData = response.data as List<Map<String,dynamic>>; //<-- converts List<dynamic> to List<Map<String,dynamic>>
return _streamController.add(jsonData); //<-- Use jsonData directly

如果你想访问API响应中的帖子详细信息,你可以访问每个Map,如下所示:

jsonData.forEach((postMap){
print("postId: ${postMap["postId"]}");
print("id: ${postMap["id"]}");
print("name: ${postMap["name"]}");
print("email: ${postMap["email"]}");
print("body: ${postMap["body"]}");
});

您应该首先添加一个模型类

class Post {
int postId;
int id;
String name;
String email;
String body;
Post({this.postId, this.id, this.name, this.email, this.body});
Post.fromJson(Map<String, dynamic> json) {
postId = json['postId'];
id = json['id'];
name = json['name'];
email = json['email'];
body = json['body'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['postId'] = this.postId;
data['id'] = this.id;
data['name'] = this.name;
data['email'] = this.email;
data['body'] = this.body;
return data;
}
}

然后用这种型号的fromJson()工厂解码响应

List<Post> posts = response.data.map<Post>((json) => Post.fromJson(json))
.toList();

然后你可以使用它,并在你想要的时候访问属性

这是解码自定义json 的方法

相关内容

最新更新