5

そのため、私はしばらくの間、このネストされたJSON文字列を解析しようとしてきました。これが通常のJava、あるいはphpでさえあれば、これはずっと前に行われていたと思います。残念ながら、私はこれでJ2MEで立ち往生しています。いくつかの検索を通じて、 JSONパーサーが1つだけ存在することがわかりました。これは、同様の質問を掘り下げて見つけたものです。別の質問の例を使って、自分でいくつかの作業を試しました。しかし、私はまだいくつかの問題を抱えています。ここで説明します。

これは私が解析しようとしている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文字列の最初の要素を消費するのが好きであることがわかりました。これは、ここの例のように、ネストされた要素を通過するのをかなり台無しにします。

使用できる代替手段はありますか?

4

2 に答える 2

4

少年、私は自分自身を撃ちたいですか。私は寝る前に自分の問題を理解しました。私のアプローチは正しかった。Printステートメントの出力を間違って読んだだけでなく、JSONがどれだけネストされているかを過小評価していたのは私の問題でした。

内部的には、JSONOBjectクラスはJSON要素やペアなどをハッシュテーブルに格納します。ハッシュテーブルには、与えられたデータをソートするという副作用があります。もちろん、これはJSONの順序付け方法から始まります。JSONの一部を消費していると思いましたが、実際にはそれらを後ろに置いているだけでした...JSONの終わりではないにしても元に戻っています。これは私を通して大いにオフになりました。ハッシュテーブル自体でtoStringを実行するまで、これに気づきませんでした。次に、JSONが実際には思ったよりもネストされていることに気付きました。私が取得したかった4つの部分。ここでは、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を使用し、何かをする前にその構造を理解してください。私はこれが二度と起こらないことを誓います。

于 2012-08-05T09:47:22.543 に答える
0

JSON次の例で文字列を解析できます

public CustomerInfo(String jsonTxt) {
    try {
        JSONObject json= (JSONObject) new JSONTokener(jsonTxt).nextValue();
        test = (String) json2.get("displayName");
    }
    catch (JSONException e) {
        e.printStackTrace();
    }
}
于 2012-08-05T02:38:53.777 に答える