java – 在J2ME中解析JSON

所以,我一直在尝试解析这个嵌套的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上使用漂亮的打印机,并在你做任何事情之前欣赏它的结构.我发誓这不会发生在我身上.

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量