无法解析字符串响应

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 响应和参数

无法解析响应 alamofire swift 3

ApolloParseException : 无法解析 http 响应

无法解析来自谷歌的 json 响应

无法解析智能卡获取响应 (TLV)