【发布时间】: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
有时像我说的那样工作
【问题讨论】:
-
您的 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