如何解析不完整的 JSON 字符串



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

[wifi1, wifi2, wifi3, wifi4, wifi5]

因此,如果得到不完整的字符串,我将处理 JSON 解析异常并使用字符串分词器,只需解析每个令牌并获取 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;
}

最新更新