无法解析字符串响应
Posted
技术标签:
【中文标题】无法解析字符串响应【英文标题】:Unable to Parse string response 【发布时间】:2021-07-24 04:04:03 【问题描述】:这是我尝试解析并尝试获取单独字符串中的值的响应,
response =
"Data1
key1='4722**********6',
key2='2107',
key3=value
value1='226',
value2=passed,
value3=tracked,
value4=noted
,
isChecked=true
"
但无法解析响应,比如
String Datas = "Data1key1='4722**********6', key2='2107', key3=valuevalue1='226',
value2=passed,value3=tracked, value4=noted, isChecked=true";
String data = Datas.substring(5);
//String data1 = data.replaceAll("\"", "");
try
JSONObject dataObject = new JSONObject((data)); //JsonObject
String strKey1= dataObject.getString("key1");
String strKey2= dataObject.getString("key2");
String strKey3= dataObject.getString("key3");
JSONObject strValueObj = new JSONObject(strKey3);
String strValue1= strValueObj.getString("value1");
String strValue2= strValueObj.getString("value2");
String strValue3= strValueObj.getString("value3");
String strValue4= strValueObj.getString("value4");
正常的字符串解析是否有效,或者使用 JSON 解析是否正确?谁能帮我解析字符串响应。
【问题讨论】:
数据字符串不是 JSON 格式,因为键和值不是双引号。因此,要解析它,您需要构建自己的解析器,因为这不是有效的 JSON 字符串。 是的,它不是有效的 JSON 字符串,响应来自硬件,无法更改格式。那我该如何解析,有没有其他的解决方案? 添加您想要将其转换为 json 的确切响应,我可以编写代码来更改它,它是关于键而不是值。你当然可以自己做。代码是这样的:String json = Datas.replaceAll("=", "\":"); 这是确切的响应,“Data1key1='4722**********6', key2='2107', key3=Key3value1='226', value2=passed,value3=tracked, value4=noted, isChecked=true" 【参考方案1】:好吧,你可以做一些数据转换来获得 JSON 格式:
private static final String KEY3 = "key3";
private static final String VALUE = "value";
void extractData() throws JSONException
String Datas = "Data1key1='4722**********6', key2='2107', key3=valuevalue1='226', value2=passed,value3=tracked, value4=noted, isChecked=true";
String data = Datas.substring(5);
String dataAsJson = data.replaceAll("=", ":");
if (dataAsJson.indexOf(KEY3) > -1)
StringBuilder dataBuilder = new StringBuilder(dataAsJson.replaceFirst(VALUE, "" + VALUE + ":"));
dataBuilder.insert(dataAsJson.indexOf("", dataAsJson.indexOf(KEY3)) + KEY3.length() - 1, "");
dataAsJson = dataBuilder.toString();
JSONObject dataObject = new JSONObject((dataAsJson));
String strKey1= dataObject.getString("key1");
String strKey3= dataObject.getString("key3");
JSONObject key3Obj = new JSONObject(strKey3);
String value = key3Obj.getString("value");
JSONObject valueObj = new JSONObject(value);
String value1 = valueObj.getString("value1");
它可以工作,但肯定不是最优雅的解决方案,如果输入会改变它的结构,它可能无法工作。
编辑:新输入:
String Datas = "Data1key1='4722**********6', key2='2107', key3=valuevalue1='226', value2=passed,value3=tracked, value4=noted, isMasked=true";
String data = Datas.substring(5);
String dataAsJson = data.replaceAll("=", ":");
if (dataAsJson.contains(KEY3))
StringBuilder dataBuilder = new StringBuilder(dataAsJson.replaceFirst(VALUE, "" + VALUE + ":"));
dataBuilder.insert(dataAsJson.indexOf("", dataAsJson.indexOf(KEY3)) + KEY3.length() - 1, "");
dataAsJson = dataBuilder.toString();
JSONObject dataObject = new JSONObject((dataAsJson));
String strKey1 = dataObject.getString("key1");
String strKey3 = dataObject.getString("key3");
JSONObject key3Obj = new JSONObject(strKey3);
String value = key3Obj.getString("value");
JSONObject valueObj = new JSONObject(value);
String value1 = valueObj.getString("value1");
【讨论】:
throws error org.json.JSONException: Expected literal value at character 0 of :'4722**********6', key2:'2107', key3:value: value1:'226', value2:passed,value3:tracked, value4:noted, isChecked:true,响应结构不会改变,一旦解析就好了 您是否复制了我的代码或将其与您的代码混合在一起?因为对我来说,您似乎使用了额外的子字符串来剪切 "key1=". 完美运行!。我的错误,我的 Datas.substring(10) 行中的错字;谢谢兄弟! 如果相同的数据是这样的,我该如何解析,"Data1key1='4722**********6', key2='2107', key3=value value1='226', value2=passed,value3=tracked, value4=noted, isMasked=true"; 抛出异常 org.json.JSONException: Unterminated object at character 122.以上是关于无法解析字符串响应的主要内容,如果未能解决你的问题,请参考以下文章
API 版本 2:无法解析带有“INVALID_ARGUMENT”错误的 JSON 响应字符串:\“:找不到字段。\”
无法通过 @POST 请求使用 Retrofit 解析 JSON 响应和参数