代码之家  ›  专栏  ›  技术社区  ›  Marc Byfield

在J2ME中解析JSON

  •  5
  • Marc Byfield  · 技术社区  · 12 年前

    因此,我已经尝试解析这个嵌套的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();
    }
    }
    

    这当然抛出了一个JSON异常。我了解到JSON库可能有一些错误。我在打印报表方面做了一些技巧。事实证明,它喜欢使用JSON字符串的第一个元素。像我们在这个例子中看到的那样,这会严重破坏嵌套元素的运行。

    有没有其他选择?

    2 回复  |  直到 12 年前
        1
  •  4
  •   Marc Byfield    12 年前

    天啊,我想开枪自杀吗。我在睡觉前解决了我的问题。我的方法是正确的;只是我读错了Print语句的输出,低估了JSON的嵌套程度。

    在内部,JSONOBject类将JSON元素、对等存储在Hashtable中。Hashtable有一个副作用,它会对提供给它的数据进行排序。这当然会影响JSON的排序方式。我认为它消耗了JSON的某些部分,而实际上只是把它们放在后面。。。如果不是JSON的末尾,则返回waaay。这让我大吃一惊。直到我在哈希表上运行了String,我才意识到这一点。然后我也意识到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上使用Pretty Printer,并欣赏它的结构。我发誓这种事不会再发生在我身上了。

        2
  •  0
  •   Bhavik Ambani    12 年前

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

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