Flutter FormatException:意外字符(在字符1处)

时间:2019-04-14 02:17:03

标签: flutter

在扑朔迷离中,我使用了一个php文件,该文件从数据库查询返回json响应,但是当我尝试解码json时,我得到了此错误:

E/flutter ( 8294): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled
Exception: FormatException: Unexpected character (at character 1)
E/flutter ( 8294): [{"0":"PRUEBA","usu_nombre":"PRUEBA"}]
E/flutter ( 8294): ^

这是我的飞镖功能:

Future<String> iniciarSesion() async{
var usuario = textUsuario.text;
var password = textPassword.text;
var nombreUsuario;
var url ="http://192.168.1.37/usuario.php";

//Metodo post
var response = await http.post(
    url,
    headers:{ "Accept": "application/json" } ,
    body: { "usuario": '$usuario',"password": '$password'},
    encoding: Encoding.getByName("utf-8")
);
  List data = json.decode(response.body);

}

然后从我的php文件中获取代码:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

include_once "Clases/conexion.php";

$usuario = $_POST['usuario'];
$password = $_POST['password'];

$consulta = "select usu_nombre
FROM usu_usuarios
WHERE usu_nusuario='$usuario'and usu_password='$password' and  usu_activo='SI'";

$mysql_obj = new Conectar();
$mysqli = $mysql_obj->crearConexion();

if($result = $mysqli->query($consulta)) {
if ($mysqli->affected_rows > 0) {
    while($row = $result->fetch_array()) {
        $myArray[] = $row;
    }
    header('Content-type: application/json');
    echo json_encode($myArray);
}else {
    header("HTTP/1.0 401 Datos Incorrectos");
    header('Content-type: application/json');
    $data = array("mensaje" => "Datos Incorrectos");
    echo json_encode($data);
}}
?>

我正在使用http dart依赖

8 个答案:

答案 0 :(得分:8)

使用以下代码解决此问题。如需更多信息,请参阅 here

var pdfText= await json.decode(json.encode(response.databody);  

答案 1 :(得分:1)

最后,我解决了抖动问题,以这种方式请求数据:

Map<String, String> headers = {
    'Content-Type': 'application/json;charset=UTF-8',
    'Charset': 'utf-8'
};

http.get('localhost:8000/users', headers: headers)

答案 2 :(得分:1)

如果您请求的是 Multipart 或 Form-data,请尝试使用 http.Response.fromStream(response)

将响应转换为简单的 http 响应

完整代码:

 String baseUrl ="https://yourUrl.com";
        var uri = Uri.parse(baseUrl);
        var request = new http.MultipartRequest("POST", uri);
        request.headers.addAll(headers);
        var multipartFile = await http.MultipartFile.fromPath(
            "file", videoFile.path);
        request.files.add(multipartFile);
        await request.send().then((response) {
        http.Response.fromStream(response).then((value) {
        print(value.statusCode);
        print(value.body);
        var cloudFlareResponse =
        CloudFlareApi.fromJson(json.decode(value.body));
        print(cloudFlareResponse.result.playback.hls);
        });

答案 3 :(得分:0)

我不知道您为什么在回答之前就得到了,但我认为它期望将{作为第一个字符,这对您的情况而言并非如此。您自己添加了还是知道为什么它是响应的一部分? 如果您可以让它回复{"0":"PRUEBA","usu_nombre":"PRUEBA"},那么您应该是安全的。

为什么要将数据保存为列表而不是字符串?通过将其作为字符串而不是列表,可以避免响应周围的方括号。

答案 4 :(得分:0)

最后,我使用laravel解决了问题,以这种方式返回了数据

return response()->json($yourData, 200, ['Content-Type' => 'application/json;charset=UTF-8', 'Charset' => 'utf-8'],
    JSON_UNESCAPED_UNICODE

答案 5 :(得分:0)

我在Android上收到此错误,因为我使用的是不安全的HTTP连接,而未在AndroidManifest中设置应用程序android:usesCleartextTraffic =“ true”/。

答案 6 :(得分:0)

FormatException: Unexpected character (at character 1) Try again ^

错误来自颤振。这可能是因为您使用对象模型捕获了 http 响应,但您的 api 响应实际上是一个 字符串 或其他。

答案 7 :(得分:-1)

这对我有用,可以捕获令牌并实现标头的主体:

Future<List> getData() async {
   final prefs = await SharedPreferences.getInstance();
   final key = 'token';
   final value = prefs.get(key ) ?? 0;
 
   final response = await http.get(Uri.parse("https://tuapi"),  headers: {
   'Content-Type': 'application/json;charset=UTF-8',
   'Charset': 'utf-8',
   "Authorization" : "Bearer $value"
   });
   return json.decode(response.body);

   }