【问题标题】:Flutter App Issue with Json Decode - Data from Socket使用 Json 解码的 Flutter App 问题 - 来自套接字的数据
【发布时间】:2021-05-22 15:31:34
【问题描述】:

关于我的应用程序的简短说明。我从用 python 编写的套接字服务器获取数据,数据采用 Json 格式。 当数据到达时,我使用 Json 解码将其转换为列表。此列表用于 Listview 构建器以显示数据。到目前为止一切顺利,但我的问题是,有时我会得到一个异常([ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: FormatException: Unexpected character) 我不明白为什么有时一切都很完美,有时我得到这个错误。如果我使用真实设备,这个错误会更频繁地出现

我的 Flutter 代码来获取数据

void getData({String ip, String port, String code}) async{
String result;

await Socket.connect(ip, int.parse(port)).then((socket) async {
  print('Connected to: '
      '${socket.remoteAddress.address}:${socket.remotePort}');
  socket.listen((data) {
      result = String.fromCharCodes(data);
  }, onDone: () {
    print("Done");
    setState(() {
      data = json.decode(result);
    });
    print (data);
  });
  socket.write(code);
});
}

Python 套接字服务器:

from datetime import datetime
import socket
from SqlServerRequest import SqlServerRequest


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.43.126', 4567))
s.listen(5)



while True:
clientsocket, address = s.accept()
print(f"Connection from {address} has been established.")
data = clientsocket.recv(2048).decode()
print(data)

if data == "open":
    o = SqlServerRequest.dataForOpenOrders()
    clientsocket.sendall(bytes(o,"utf-8"))
if data == "closed":
    c = SqlServerRequest.dataForClosedOrders()
    clientsocket.sendall(bytes(c,"utf-8"))

clientsocket.close()

以及我在 python 中对数据进行编码的类

    def dataForClosedOrders():
    try:
        conn = odbc.connect(conn_string)
    except Exception as e:
        print(e)
        print('task is terminated')
        sys.exit()
    else:
        cursor = conn.cursor()

    read_statement = "SELECT Bestelldatum, Adresse, Total, AuftragNr, ZahlungsArt, Quelle, Telefon, dauer_lieferung, zpkt_ausgeliefert, Benutzer FROM Auftrag WHERE Bestelldatum > '2021-21-04' AND Bestelldatum < '2021-22-04' AND Abholung = '0' ORDER BY Bestelldatum ASC;"
    

    cursor.execute(read_statement) 

    rows = cursor.fetchall() 
    objects_list = []
    for row in rows:
        d= collections.OrderedDict()
        d["Bestelldatum"]= row[0].strftime("%H:%M")
        a = json.loads(row[1])
        d["Adresse"] = a["str"]
        d["Tor"] = a["tor"]
        d["Stiege"] = a["stg"]
        d["Stock"] = a["stk"] 
        d["Tür"] = a["tür"]
        d["PLZ"] = a["plz"]
        d["Total"] = row[2]
        d["AuftragNr"]= row[3]
        d["ZahlungsArt"]= row[4]
        d["Quelle"]= row[5]
        d["Telefon"]= row[6]
        d["dauer_lieferung"]= row[7]
        if row[8]== None:
            d["Lieferdauer"]="nicht möglich"
        else:
            zs = row[8]-row[0]
            minutessince = int(zs.total_seconds() / 60)
            d["Lieferdauer"]=minutessince
        d["Benutzer"]= row[9]
        objects_list.append(d)
    j = json.dumps(objects_list)
    #print (j)
    cursor.commit()
    cursor.close()
    return j

Image of the error

有时像我说的那样工作

Scrennshot from device when is working

【问题讨论】:

  • 您的 json 格式出现错误,它应该是 "k":"...",但它的 k":"..." 是无效密钥。在k 之前没有" 键它需要像这样"k":"...",
  • 不,那只是一个片段,那只是一个单词的最后一个字符。有时是另一个。它并不能解释为什么有时会起作用
  • socket .transform(json.fuse(utf8).decoder) .listen((event) { print(event); });
  • @pskink 我试过你的代码,我得到一个错误 (json.fuse(utf8).decoder) 错误:参数类型 Converter Object> 不能分配给参数类型StreamTransformer
  • @pskink 检查我的编辑,不,我无法编译它

标签: python json flutter sockets dart


【解决方案1】:

感谢 pskink 我找到了解决方案。

我改变了我的代码

await Socket.connect(ip, int.parse(port)).then((socket) async {
print('Connected to: '
  '${socket.remoteAddress.address}:${socket.remotePort}');
socket.listen((data) {
  result = String.fromCharCodes(data);
}, onDone: () {
print("Done");
setState(() {
  data = json.decode(result);
});
print (data);
});
socket.write(code);
});
}

await Socket.connect(ip, int.parse(port)).then((socket) async {
  print('Connected to: '
      '${socket.remoteAddress.address}:${socket.remotePort}');
  socket.cast<List<int>>().transform(json.fuse(utf8).decoder).listen((event) {
    setState(() {
      data = event;
    });
  });

效果很好。 如果同一个人有同样的问题,也许我会提供帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多