2012-08-05 14 views
5

Quindi, ho cercato per un po 'di tempo per analizzare questa stringa JSON annidata. Se questo fosse normale Java, o anche php, sono sicuro che sarebbe stato fatto molto tempo fa. Sfortunatamente sono bloccato con J2ME su questo. Attraverso alcune ricerche ho scoperto che esiste un lone JSON parser. Questo ho trovato attraverso alcuni scavi su un similar question. Ho provato un po 'di lavoro da solo, con un esempio su another question. Tuttavia, sto ancora avendo alcune difficoltà. Spiegherò ora.Parsing JSON in J2ME

Questa è la stringa JSON che sto cercando di analizzare:

{"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\":[]}"} 

Non ti preoccupare questo è solo dati di esempio, nulla di reale qui.

Ora ho bisogno dei clienti No, nome, indirizzo e saldo del conto di risparmio. Questo è il codice che ho usato per analizzarlo:

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(); 
} 
} 

Questo ovviamente lancia una JSONException. Ho imparato che la libreria JSON può avere alcuni bug. Ho fatto alcuni trucchi, con le dichiarazioni di stampa. Si scopre che gli piace consumare il primo elemento della stringa JSON. Questo rovina pesantemente andando attraverso elementi annidati come abbiamo qui nell'esempio.

C'è un'alternativa che posso usare?

risposta

4

ragazzo, voglio spararmi. Ho capito il mio problema prima di andare a letto. Il mio approccio era corretto; era solo una questione di me che leggevo l'output delle istruzioni Print errato e sottovalutavo quanto fosse nidificato il JSON.

Internamente, la classe JSONOBject memorizza gli elementi JSON, le coppie, ecc. In un Hashtable. L'Hashtable ha un effetto collaterale in cui ordina i dati che gli vengono dati. Questo ovviamente attraverso il modo in cui è stato ordinato il JSON. Ho pensato che stesse consumando alcune parti del JSON, mentre in realtà era solo metterle in fondo ... il back indietro, se non la fine del JSON. Questo notevolmente attraverso di me. Non me ne sono reso conto fino a quando non ho appena corso a String sulla Hashtable stessa. Mi rendo anche conto che il JSON era in realtà più nidificato di quanto pensassi. Le quattro parti che volevo ottenere, in cui 3 oggetti JSON nidificati diversi.

Quindi, la mia soluzione era di salvarmi ancora di più dal dolore e ho appena messo il JSON attraverso una stampante carina e guardato e la struttura correttamente.

Ecco il mio codice Soluzione:

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: utilizzare sempre una bella stampante sulla vostra JSON, e apprezzare la sua struttura prima di fare qualsiasi cosa. Giuro che non mi succederà più.

+0

se la risposta funziona per te, contrassegnala come accettata in modo che possa aiutare gli altri che cercano la stessa cosa. :) – Spudley

+0

Sì, questo mi ha davvero fatto sentire un idiota per un po '. Lo accetterò quando mi permetterà di farlo. Grazie mille ragazzi! :) –

+0

Hai ancora il file jar? Non riesco a trovare il vaso JSON-ME in nessun modo: S – eddy

0

È possibile analizzare la stringa JSON dal seguente esempio

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

Grazie mille, sembra più pulito di quello che stavo cercando. Penso di aver risolto il problema. Ero più io, non leggevo la struttura JSON giusta. –