java - 在 J2ME 中解析 JSON

标签 java json parsing java-me

所以,我已经尝试了一段时间来解析这个嵌套的 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\",\"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 库可能有一些错误。我用打印语句做了一些技巧。事实证明,它喜欢使用 JSON 字符串的第一个元素。就像我们在示例中使用的那样,这会严重破坏嵌套元素。

我可以使用替代方案吗?

最佳答案

男孩,我想开枪自杀吗?我在 sleep 前弄清楚了我的问题。我的做法是正确的;这只是我错误地阅读了 Print 语句的输出以及低估了 JSON 的嵌套程度。

在内部,JSONOBject 类将 JSON 元素、对等存储在哈希表中。 Hashtable 有一个副作用,它会对提供给它的数据进行排序。这当然是通过 JSON 的排序方式来实现的。我认为它正在消耗 JSON 的某些部分,而它实际上只是将它们放在后面......如果不是 JSON 的末尾,那就回来了。这大大地通过了我。直到我在 Hashtable 本身上运行 toString 时,我才意识到这一点。然后我也意识到 JSON 实际上比我想象的更嵌套。我想要获取的四个部分,在 3 个不同的嵌套 JSON 对象中。

因此,我的解决方案是让自己省去更多的麻烦,只需将 JSON 通过 pretty-print 打印出来,然后正确地查看和结构。

这是我的解决方案代码:

 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 上使用 Pretty Printer,并在执行任何操作之前了解它的结构。我发誓这不会再发生在我身上。

关于java - 在 J2ME 中解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11813146/

相关文章:

java - SourceDataLine 跳过指定数量的字节(JavaSound)

java - 在从 Ant 运行的 javascript 中,如何获取参数值?

javascript - d3.js choropleth map -- 如何将多个属性从 CSV 映射到 JSON,以便我可以在工具提示中使用它?

php - php中的模板字符串解析

java - 来自 java String.split 的奇怪返回值,不知道为什么

java - 使用 java 提取 .rar 文件

java - 如何在@Transactional模式下强制提交实体

jquery - 如何判断 jquery tmpl 中是否存在子属性

c# - 使用 C# 将 JSON 转换为 XML

java - 尽管编码正确,XML 解析器仍无法解析 UTF-8