gpt4 book ai didi

java - 如何解析不完整的 JSON 之类的字符串

转载 作者:行者123 更新时间:2023-12-02 12:19:29 26 4
gpt4 key购买 nike

我正在通过 BLE 从我的外围设备读取一些数据到我的 Android 应用程序。该应用程序以 JSON 格式从 BLE 设备获取数据。一切正常,除了在少数情况下,当我从 BLE 设备获取不完整的 JSON 字符串时(我无法控制它,我需要处理我收到的任何内容。最初,我得到一个简单的 JSON 数组,如

[wifi1, wifi2, wifi3, wifi4, wifi5]

因此,如果得到不完整的字符串,我将处理 JSON 解析异常并使用 String Tokenizer 并简单地解析每个 token 并获取 wifi 名称

StringTokenizer tokens = new StringTokenizer(new String(bytes), ",");
int size = tokens.countTokens();
HashMap<String, Object> map;
for (int i = 0; i < size; i++) {
map = new HashMap<String, String>();
map.put("Wifi, tokens.nextToken().replace("\"", "").replace("]", "").replace("[", ""));

但是现在 JSON 字符串已经更改并且包含了很多其他信息,这是我得到的新 JSON

[{"ssid":"Wifi1","rssi":-50,"encrypt":"on"},{"ssid":"wifi2","rssi":-61,"encrypt":"on"},{"ssid":"wifi3","rssi":-81,"encrypt":"of

现在,如果我得到这种格式的不完整 JSON(如上所述),我将无法使用 StringTokenizer 解析 wifi 名称和加密信息(它变得非常复杂和难看)。您知道如何解析这些 wifi 名称并加密上述字符串中的信息吗?任何建议都会有很大帮助。

最佳答案

感谢 @pskink 和 @Andreas 建议流式 JSON 解析器,我尝试了这个,它对我有用。希望它对其他人也有帮助。

 public void parseWifiJSON(byte[] bytes)
{
trackerWifiScanList = readJsonStream(bytes);
// do stuff with your list
}

public List<WifiScan> readJsonStream(byte[] bytes) {

JsonReader reader = new JsonReader(new StringReader(new String(bytes)));
List<WifiScan> resultList = null;
try {
resultList = readMessagesArray(reader);
reader.close();
} catch (IOException e) {
if (reader != null) {
try {
reader.close();
} catch (IOException ex) {
// Do nothing
}
}
}

return resultList;
}

public List<WifiScan> readMessagesArray(JsonReader reader) throws IOException {
ArrayList<WifiScan> messages = new ArrayList<WifiScan>();

try {
reader.beginArray();
while (reader.hasNext()) {
messages.add(readMessage(reader));
}
}catch (Exception e)
{
if (reader != null) {
try {
reader.endArray();
} catch (IOException ex) {
// Do nothing
}
}
}
return messages;
}

public WifiScan readMessage(JsonReader reader) throws IOException {
String wifissid ="";
int rssi = 0;
String encrypt="";
WifiScan wifInfo = new WifiScan();
try {
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("ssid")) {
wifissid = reader.nextString();
} else if (name.equals("rssi")) {
rssi = reader.nextInt();
} else if (name.equals("encrypt")) {
encrypt = reader.nextString();
} else {
reader.skipValue();
}
}
reader.endObject();
wifInfo.setSsid(wifissid);
wifInfo.setRssi(rssi);
wifInfo.setEncrypt(encrypt);
}catch (Exception e)
{
// JSON was not complete so just set a dummy object.
wifInfo.setSsid("");
wifInfo.setRssi(0);
wifInfo.setEncrypt("");
}
return wifInfo;
}

关于java - 如何解析不完整的 JSON 之类的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45897892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com