【发布时间】:2014-06-17 16:26:58
【问题描述】:
我正在使用ksoap2 来使用基于SOAP 的web-service,而我得到的响应格式类似于:
anyType{
key1=value1;
key2=value2;
key3=anyType{
key4=value4;
key5=value5;
key6= anyType{
key7= anyType{
key8= value8;
};
};
};
key9=value9;
}
即JSON objects(如果我们假设这是JSON)以anyType{开头并以}结尾,键和值之间用=分隔,;是字段分隔符/语句终止符/其他。
我尝试使用online validators 验证响应字符串,但失败了。这指出这不是一个有效的JSON object。
类似的例子可以在in this question找到。但是 accepted answer 对我不起作用,因为首先响应字符串不是以{ 开头,而是以anyType{ 开头,如果我将anyType{ 放在if 条件中,下次遇到anyType{ (a nested JSON object) 时仍然会引发异常
第二个答案似乎在某种程度上有效,但问题是我的整个响应字符串似乎是作为一个属性出现的(因为 propertyCount 是 1),所以当我打印出属性的名称或值,则打印整个响应字符串。
我用谷歌搜索了很多,并尝试了我能找到的一切。所以我想我必须自己解析它。
我的问题是解析这种响应的最佳方式是什么。
我是否应该尝试使用regex 解析它或我应该通过将所有出现的anyType{ 替换为{、@987654344 来将响应字符串转换为JSON format @ by :, ; by , etc. etc. ,然后通过以下方式将此字符串转换为 JSONObject:
jsonObject= new JSONObject(responseString);
然后通过以下方式提取键和值:
Iterator itr= jsonObject.keys();
while(itr.hasNext()) {
String value = null;
String key= (String) itr.next();
try {
value= jsonObject.getString(key);
} catch (JSONException e) {
e.printStackTrace();
}
Log.i(TAG, key + " : " + value);
// ......
}
import java.util.Iterator;
import org.json.JSONException;
import org.json.JSONObject;
public class JSONPracticeOne {
private static JSONObject jsonObject;
private static String key;
private static String value;
public static void main(String[] args) {
String responseString= " anyType{key1=value1;key2=value2;key3=anyType{key4=value4;key5=value5;key6=anyType{key7=anyType{key8=value8};};};key9=value9;}";
responseString = responseString.replaceAll("anyType\\Q{\\E", "{");
responseString = responseString.replaceAll("\\Q=\\E", ":");
responseString = responseString.replaceAll(";", ",");
responseString = responseString.replaceAll(",\\Q}\\E","}");
//System.out.println(responseString);
//System.out.println();
responseString= responseString.replaceAll("(:\\{)", "-"); //Replace :{ by -
responseString= responseString.replaceAll("[:]", "\":\""); //Replace : by ":"
responseString= responseString.replaceAll("-", "\":{\""); //Replace - back to :{
//System.out.println(responseString);
//System.out.println();
responseString = responseString.replaceAll("[,]",",\"");
//System.out.println(responseString);
//System.out.println();
//String string= responseString.charAt(1) + ""; System.out.println("CHECHE " + string);
responseString = responseString.replaceFirst("[\\{]","{\"");
//System.out.println(responseString);
//System.out.println();
//responseString= responseString.replaceAll("([^\\}],)","\","); // truncation
responseString= responseString.replaceAll("(\\},)", "-"); // replace }, by -
responseString= responseString.replaceAll(",","\","); //replace , by ",
responseString = responseString.replaceAll("-","},"); // replace - back to },
//System.out.println(responseString);
//System.out.println();
responseString = responseString.replaceAll("(?<![\\}])\\}","\"}");
System.out.println(responseString);
System.out.println("**********************************************************************************************\n\n");}}
输出:-
{
"key1":"value1",
"key2":"value2",
"key3":{
"key5":"value5",
"key6":{
"key7":{
"key8":"value8"
}
},
"key4":"value4"
},
"key9":"value9"
}
【问题讨论】:
-
我不知道有人说什么,但你得到的不是 json
-
@IllegalArgument 谢谢,经过一番辛劳,我得出了同样的结论,但是问题(在问题中显示为粗体)仍然是解析它的最佳方法吗?
-
发布您的整个响应解析代码都依赖于它我假设最终代码将导致类似字符串操作的结果
-
实际上我确实尝试过类似的事情并发布在问题中。我仍然需要将键和值包含在
"中;但是像这样操作响应字符串似乎不是一种有效的方法。必须有更好的方法来处理 ti。 -
你能说出你想解析出什么吗?忽略7和6,key8够不够?
标签: android regex json soap ksoap2