在J2ME中解析JSON

5

所以,我一直在尝试解析这个嵌套的JSON字符串。如果这是普通的Java,甚至是php,我相信早就已经完成了。不幸的是,我在这个问题上卡住了J2ME。通过一些搜索,我发现存在一个孤立的JSON解析器。我是通过在类似的问题上挖掘时发现的。我尝试了一些自己的工作,并参考了另一个问题的示例。然而,我仍然遇到了一些困难。我现在来解释一下。

这是我正在尝试解析的JSON字符串:

{"Result":"Success","Code":"200","CustomerInfo":"{\"clientDisplay\":{\"customerId\":429,\"globalCustNum\":\"0012-000000429\",\"displayName\":\"Hugo Daley\",\"parentCustomerDisplayName\":\"G-KINGSTON\",\"branchId\":12,\"branchName\":\"Bangalore_branch1244724101456\",\"externalId\":\"123000890\",\"customerFormedByDisplayName\":\"New User1244724101456\",\"customerActivationDate\":\"2012-06-17\",\"customerLevelId\":1,\"customerStatusId\":3,\"customerStatusName\":\"Active\",\"trainedDate\":null,\"dateOfBirth\":\"1950-10-10\",\"age\":61,\"governmentId\":\"100000090\",\"clientUnderGroup\":true,\"blackListed\":false,\"loanOfficerId\":17,\"loanOfficerName\":\"New User1244724101456\",\"businessActivities\":null,\"handicapped\":null,\"maritalStatus\":null,\"citizenship\":null,\"ethnicity\":null,\"educationLevel\":null,\"povertyStatus\":null,\"numChildren\":null,\"areFamilyDetailsRequired\":false,\"spouseFatherValue\":null,\"spouseFatherName\":null,\"familyDetails\":null},\"customerAccountSummary\":{\"globalAccountNum\":\"001200000001259\",\"nextDueAmount\":\"2128.0\"},\"clientPerformanceHistory\":{\"loanCycleNumber\":0,\"lastLoanAmount\":\"0.0\",\"noOfActiveLoans\":0,\"delinquentPortfolioAmount\":\"0.0\",\"totalSavingsAmount\":\"1750.0\",\"meetingsAttended\":0,\"meetingsMissed\":0,\"loanCycleCounters\":[],\"delinquentPortfolioAmountInvalid\":false},\"address\":{\"displayAddress\":null,\"city\":\"\",\"state\":\"\",\"zip\":\"\",\"country\":\"\",\"phoneNumber\":\"\"},\"recentCustomerNotes\":[{\"commentDate\":\"2012-06-17\",\"comment\":\"appr\",\"personnelName\":\"New User1244724101456\"}],\"customerFlags\":[],\"loanAccountsInUse\":[{\"globalAccountNum\":\"001200000001262\",\"prdOfferingName\":\"Hawker Loan\",\"accountStateId\":3,\"accountStateName\":\"Application Approved\",\"outstandingBalance\":\"15643.0\",\"totalAmountDue\":\"8977.0\"},{\"globalAccountNum\":\"001200000001279\",\"prdOfferingName\":\"Hazina Micro Loan\",\"accountStateId\":2,\"accountStateName\":\"Application Pending Approval\",\"outstandingBalance\":\"6439.0\",\"totalAmountDue\":\"1716.0\"},{\"globalAccountNum\":\"001200000001280\",\"prdOfferingName\":\"Car Finance\",\"accountStateId\":3,\"accountStateName\":\"Application Approved\",\"outstandingBalance\":\"381.5\",\"totalAmountDue\":\"120.0\"}],\"savingsAccountsInUse\":[{\"globalAccountNum\":\"001200000001260\",\"prdOfferingName\":\"Current Account\",\"accountStateId\":16,\"accountStateName\":\"Active\",\"savingsBalance\":\"1750.0\",\"prdOfferingId\":null}],\"customerMeeting\":{\"meetingSchedule\":\"Recur every 1 Week(s) on Monday\",\"meetingPlace\":\"KINGSTON\"},\"activeSurveys\":false,\"customerSurveys\":[],\"closedLoanAccounts\":[{\"globalAccountNum\":\"001200000001261\",\"prdOfferingName\":\"AUTO LOAN-2\",\"accountStateId\":10,\"accountStateName\":\"Cancel\",\"outstandingBalance\":\"2576.0\",\"totalAmountDue\":\"206.0\"}],\"closedSavingsAccounts\":[]}"}

不要担心,这只是样本数据,没有真实内容。
现在我需要顾客的编号、姓名、地址和储蓄账户余额。以下是我用来解析它们的代码:
public CustomerInfo(String jsonTxt) {
try {
    JSONObject json = new JSONObject(jsonTxt);
        JSONObject customer = json.getJSONObject("CustomerInfo");
    custNo = json.getString("globalCustNum");
    custName = json.getString("displayName");
    address = json.getString("DisplayAddress");
    savAcctBal =  json.getDouble("totalSavingsAmount");
} catch (final JSONException je) {
        je.printStackTrace();
}
}

当然,这会抛出一个JSONException。我了解到JSON库可能有一些bug。我运用了一些技巧,利用print语句来排查问题。结果发现它喜欢消耗JSON字符串的第一个元素。这严重影响了像我们在这个例子中遍历嵌套元素。
有没有其他可替代的解决方法?
2个回答

4

哎呀,我真希望自己能开枪自杀。在睡觉前,我终于找到了问题所在。我的方法是正确的,只是我把Print语句输出的内容读错了,并且低估了JSON嵌套的程度。

在内部,JSONObject类将JSON元素、对、等等存储在Hashtable中。Hashtable具有一个副作用,它会对给定的数据进行排序。当然,这会打乱JSON的顺序。我以为它正在消耗一些JSON的部分,而实际上它只是把它们放到最后...如果不是JSON的结尾,就是放到最后。这让我非常困惑。直到我对Hashtable本身运行toString时,我才意识到这一点。然后我也意识到JSON实际上比我想象的更加嵌套。我想要获取的四个部分在三个不同的嵌套JSON对象中。

因此,我的解决方案是让自己少受苦,只需将JSON通过漂亮的打印机打印出来,然后正确地查看结构即可。

以下是我的解决方案代码:

 public CustomerInfo(String jsonTxt) {
try {
    JSONObject json = new JSONObject(jsonTxt);
        JSONObject customer = new JSONObject(json.getString("CustomerInfo"));
        JSONObject client = new JSONObject(customer.getString("clientDisplay"));
        custNo = client.getString("globalCustNum");
    custName = client.getString("displayName");
        JSONObject cph = new JSONObject(customer.getString("clientPerformanceHistory"));
        JSONObject caddress = new JSONObject(customer.getString("address"));
    address = caddress.getString("displayAddress");
    savAcctBal =  cph.getDouble("totalSavingsAmount");
} catch (final JSONException je) {
        je.printStackTrace();
}
}

专业技巧:在处理JSON数据之前,始终使用美化程序,并在开始操作之前仔细理解其结构。我发誓这样不会再发生了。


如果答案对您有用,请将其标记为已接受,以便帮助其他搜索相同问题的人。 :) - Spudley
是的,这让我感觉像个白痴了一段时间。当它允许我这样做时,我会接受它。非常感谢你们! :) - Marc Byfield
你还有那个jar文件吗?我找不到json-me jar文件了:S - eddy

0

你可以通过以下示例解析 JSON 字符串

public CustomerInfo(String jsonTxt) {
    try {
        JSONObject json= (JSONObject) new JSONTokener(jsonTxt).nextValue();
        test = (String) json2.get("displayName");
    }
    catch (JSONException e) {
        e.printStackTrace();
    }
}

非常感谢,看起来比我尝试的更清晰。我想我已经解决了这个问题。更多是我没有正确阅读JSON结构。 - Marc Byfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接