"意想不到的性格"关于解码JSON

时间:2018-04-04 11:45:11

标签: json dart decode flutter

这是代码,

    static TodoState fromJson(json) {
          JsonCodec codec = new JsonCodec();
            List<Todo> data = codec.decode(json["todos"]);
            VisibilityFilter filter = codec.decode(json['visibilityFilter']);


     return new TodoState(todos: data,
                          visibilityFilter: filter);
  }

Android Studio提供给我的错误低于

[VERBOSE-2:dart_error.cc(16)] Unhandled exception:
FormatException: Unexpected character (at character 3)

知道如何让它有效吗?

enter image description here

这是Json的输出,Redux给我

4 个答案:

答案 0 :(得分:3)

您的代码以及您尝试解析的字符串存在问题。我试图弄清楚该字符串的生成位置,或者您是否自己发布了该代码。

有效的Json使用&#34;&#34;围绕名字和&#34;&#34;围绕弦乐。你的字符串在名字和&#39;&#39;之间没有任何用处。围绕着弦乐。

如果将其粘贴到DartPad中,第一个将错误输出,而第二个将成功:

import 'dart:convert';

void main() {
  JsonCodec codec = new JsonCodec();
  try{
    var decoded = codec.decode("[{id:1, text:'fdsf', completed: false},{id:2, text:'qwer', completed: true}]");
    print("Decoded 1: $decoded");
  } catch(e) {
    print("Error: $e");
  }

  try{
    var decoded = codec.decode("""[{"id":1, "text":"fdsf", "completed": false},{"id":2, "text":"qwer", "completed": true}]""");
    print("Decoded 2: $decoded");
  } catch(e) {
    print("Error: $e");
  }
}

您的代码的问题是您希望解码器直接解码到List。它不会这样做;它会解码为dynamic恰好是List<dynamic>,其项目恰好是Map<String, dynamic>

有关如何在Dart中处理json的信息,请参阅flutter's Json documentation

答案 1 :(得分:1)

我也有类似的错误类型,请确保.decode方法的参数不应为空对象。

try {
if(json["todos"].isNotEmpty) {
List<Todo> data = codec.decode(json["todos"]);
}
if(json["todos"].isNotEmpty) {
VisibilityFilter filter = codec.decode(json['visibilityFilter']);
}
}
catch(e) {
print(e);
}

尝试一下,希望它对您有用。

答案 2 :(得分:1)

如果有人来到这里,并且您正在使用dio包调用http请求,则需要将responseType设置为plain

 BaseOptions options = new BaseOptions(
    baseUrl: "<URL>",
    responseType: ResponseType.plain
  );

答案 3 :(得分:0)

我不知道是不是这种情况,但是当我的JSON看起来像这样时,我遇到了类似的错误

[   {    ...   }, ]

不是这样

[   {    ...   } ]

逗号引起了问题。