所以,我一直在尝试解析这个嵌套的JSON字符串.如果这是普通的Java,甚至是PHP,我相信很久以前就已经完成了.不幸的是,我坚持使用J2ME.通过一些搜索我发现有一个lone JSON parser.这是我通过similar question的一些挖掘找到的.我自己尝试了一些工作,在another question有一个例子.但是,我仍然有一些困难.我现在解释一下.
这是我正在尝试解析的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","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库可能有一些错误.我用打印语句做了一些技巧.事实证明,它喜欢使用JSON字符串的第一个元素.这会严重影响嵌套元素,就像我们在示例中所见.
有没有我可以使用的替代方案?
男孩,我想拍自己.在我上床睡觉之前,我想出了自己的问题.我的方法是正确的;这只是我读取Print语句输出错误以及低估JSON嵌套方式的问题.
在内部,JSONOBject类将JSON元素,对等存储在Hashtable中. Hashtable具有副作用,它将对给定的数据进行排序.这当然是关于如何订购JSON的.我认为它消耗了JSON的某些部分,而它实际上只是将它们放在后面……如果不是JSON的结尾那么回事.这大大地通过了我.在我刚刚在Hashtable上运行toString之前,我没有意识到这一点.然后我也意识到JSON实际上比我想象的更嵌套.我想要获得的四个部分,在3个不同的嵌套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();
}
}
protip:总是在你的JSON上使用漂亮的打印机,并在你做任何事情之前欣赏它的结构.我发誓这不会发生在我身上.