如何使用Java将包含JSON对象的字符串转换为实际的JSON
我研究这个问题已经三天多了,但找不到任何解决办法。我的安卓项目向我的gcloud函数发出请求,该函数返回字符串格式的字符串响应:
[{"response": [{"Commission": 50, "Price": 0.5, "Quantity": "20"}, {"Commission": 50, "Quantity": 20, "Price": 1}, {"Quantity": 20, "Price": 10, "Commission": 50}], "code": 200}]
我能够将字符串转换为JSON并检索“response”键的值
try {
//convertion of response to json to fetch value
JSONObject jsonObj = new JSONObject("[{"response": [{"Commission": 50, "Price": 0.5, "Quantity": "20"}, {"Commission": 50, "Quantity": 20, "Price": 1}, {"Quantity": 20, "Price": 10, "Commission": 50}], "code": 200}]");
String code = jsonObj.getString("code");
final String Cod = code;
if (Cod.equals("200")){
String availableInv = jsonObj.getString("response");
availableInv = availableInv.replace("[", "");
availableInv = availableInv.replace("]", "");
String strng[] = availableInv.split("},");
for (String val:strng) {
int valLength = val.length();
if(!val.substring(valLength-1, valLength).contentEquals("}")) {
val +="}";
}
System.out.println(">>>>>>=====================response==========="+val);
JSONObject jsonObjInv = new JSONObject(val);
float price = Float.valueOf(jsonObjInv.getString("Price"));
float comission = Float.valueOf(jsonObjInv.getString("Commission"));
float quantity = Float.valueOf(jsonObjInv.getString("Quantity"));
myDataset.add(new InvestmentsModel(price,comission, quantity));
}
}
}
现在,我希望能够遍历JSON对象的列表,并获取键和值。 当我运行解决方案时,出现以下错误:
2020-03-24 16:17:55.235 4959-5006/com.example.SMS E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
Process: com.example.SMS, PID: 4959
java.util.regex.PatternSyntaxException: Syntax error in regexp pattern near index 1
},
^
at java.util.regex.Pattern.compileImpl(Native Method)
at java.util.regex.Pattern.compile(Pattern.java:1340)
at java.util.regex.Pattern.<init>(Pattern.java:1324)
at java.util.regex.Pattern.compile(Pattern.java:946)
at java.lang.String.split(String.java:2384)
at java.lang.String.split(String.java:2426)
at com.example.SMS.Fragment.investEarnFrag_1$5.onResponse(investEarnFrag_1.java:251)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:504)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
# 1 楼答案
似乎你在评论中找到了答案。然而,我认为这里有一点值得强调
首先,由于您已经决定将原始
json
响应序列化为java
对象,在本例中为JSONObject
,因此不再需要解析字符串的其余部分。你应该坚持使用其中一种方法来保持一致。因此,在这种情况下,方法应该要么解析整个json
字符串,要么使用org.json
特性。在我个人看来,你应该继续使用org.json
使用
org.json
您共享的响应是
array
/list
ofobject
的形式既然我们有},我们应该用
array
{JSONArray
来保持我们的json
现在,我们在
jsonObj
变量中有一个内部对象,它是:因此,我们可以很容易地得到
response
键,它将是object
的array
。我们可以很容易地重复它对于你的问题,这可能是一个比解析原始响应更幼稚的答案
更进一步
似乎我们已经有了
InvestmentsModel
的模型类。更优雅的方法是将事情保持在自己的上下文中,并为pojo
创建响应假设我们有这样的
InvestmentsModel
:对于响应结构,我们有:
然后代码变成:
输出与
InvestmentsModel
的toString()
一样:再进一步
最后一个建议是使用swagger来跟踪api并去除大部分样板代码。它既可以用于客户端,也可以用于服务器,并保持API文档化和干净。请检查一下this是否有虚张声势