2012-08-05 69 views
5

所以,我一直试图解析这个嵌套的JSON字符串。如果这是普通的Java,甚至是PHP,我相信这会在很久以前完成。不幸的是,我被这个J2ME卡住了。通过一些搜索,我发现有一个lone JSON parser。我通过挖掘similar question发现了这个。我已经尝试了一些我自己的工作,例如another question。但是,我仍然有一些困难。我现在解释一下。在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。我用打印语句做了一些技巧。事实证明,它喜欢消费JSON字符串的第一个元素。这会严重地破坏嵌套元素,就像我们在这里的例子。

有没有其他方法可以使用?

回答

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使用漂亮的打印机,并欣赏它的结构,你做任何事情之前。我发誓这不会再发生在我身上。

+0

如果答案适合您,请将其标记为已接受,以便可以帮助其他人搜索同一事物。 :) – Spudley 2012-08-05 15:14:48

+0

是的,这真的让我感觉像一个白痴一段时间。当它允许我时,我会接受它。多谢家伙! :) – 2012-08-05 15:38:04

+0

你还有jar文件吗?我找不到json-me jar:S – eddy 2014-05-24 12:55:27

0

您可以通过下面的例子解析JSON

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

非常感谢,看起来比我想要的更清洁。我想我已经解决了这个问题。这更多的是我,没有正确阅读JSON结构。 – 2012-08-05 09:39:19