【问题标题】:"Unexpected Character" on Decoding JSON解码 JSON 中的“意外字符”
【发布时间】:2018-09-13 23:11:05
【问题描述】:

以下是代码:

    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)] 未处理的异常: FormatException:意外字符(在字符 3 处)

知道如何让它工作吗?

这是由 Redux 生成的 Json 的输出。

【问题讨论】:

  • 你的 json 是什么样子的?
  • 它是由redux自动制作的;使用 redux persist,它基本上是一个内部有对象的数组,对象有一个 id(int)、text(string)、一个 completed(bool)
  • codec.decode(json["todos"].replace("\ufeff", "")); 如果是 UTF-8 BOM。
  • 我不需要替换它,只需将它传递给一个列表以重复使用,然后保存。本地数据。
  • 请发布您从 Redux 获得的 JSON 的输出

标签: json flutter dart


【解决方案1】:

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

有效的 Json 在名称周围使用“”,在字符串周围使用“”。您的字符串在名称周围不使用任何内容,在字符串周围使用 ''。

如果将其粘贴到 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");
  }
}

您的代码的问题是您希望解码器直接解码为列表。它不会这样做;它将解码为dynamic,恰好是List&lt;dynamic&gt;,其项目恰好是Map&lt;String, dynamic&gt;

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

【讨论】:

【解决方案2】:

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

[ { ... }, ]

不是这样的

[ { ... } ]

逗号导致了问题。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 非常感谢@Bawantha...你节省了我的时间。
    【解决方案4】:

    我也有类似的错误,请确保 .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);
    }
    

    试试这个,希望对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 2022-01-01
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多