2012-08-05 19 views
5

Also habe ich seit einiger Zeit versucht, diese geschachtelte JSON-Zeichenfolge zu analysieren. Wenn dies reguläres Java oder sogar PHP wäre, wäre das sicher längst geschehen. Leider stecke ich bei J2ME fest. Durch etwas Suchen fand ich, dass dort ein lone JSON parser austritt. Dies fand ich durch etwas Graben auf einem similar question. Ich habe selbst einige Arbeiten versucht, mit einem Beispiel unter another question. Ich habe jedoch immer noch ein paar Schwierigkeiten. Ich werde es jetzt erklären.JSON in J2ME analysieren

Dies ist die JSON-String ich zu analysieren, ich versuche:

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

Sorgen Sie sich nicht diese nur Beispieldaten ist, nichts Wirkliches hier.

Jetzt benötige ich die Kunden Nein, Name, Adresse und Sparkonto Balance. Dies ist der Code, den ich verwendet habe, um es zu analysieren:

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

Dies natürlich wirft einen JSONException. Ich habe gelernt, dass die JSON-Bibliothek einige Bugs haben kann. Ich habe ein paar Tricks mit Druckanweisungen gemacht. Es stellt sich heraus, dass es gerne das erste Element der JSON-Zeichenfolge konsumiert. Dies verschraubt sich stark durch verschachtelte Elemente wie hier im Beispiel.

Gibt es eine Alternative, die ich verwenden kann?

Antwort

4

Boy, analysieren ich mich schießen wollen. Ich habe mein Problem herausgefunden, bevor ich ins Bett ging. Mein Ansatz war korrekt; Es war nur eine Frage von mir, die Ausgabe von Print-Anweisungen falsch zu lesen und zu unterschätzen, wie verschachtelt der JSON war.

Intern speichert die JSONOBject-Klasse die JSON-Elemente, -Paare usw. in einer Hashtable. Die Hashtable hat einen Nebeneffekt, wo sie die Daten sortiert, die ihr übergeben werden. Dies natürlich durch aus wie die JSON bestellt wurde. Ich nahm an, dass es einige Teile des JSON verzehrte, während es wirklich nur in den Hintergrund gestellt wurde ... das waay zurück, wenn nicht das Ende des JSON. Das geht mir sehr durch. Ich habe das erst bemerkt, als ich gerade auf der Hashtable selbst zu String gelaufen bin. Ich stelle dann auch fest, dass der JSON tatsächlich mehr verschachtelt war, als ich dachte. Die vier Teile, die ich bekommen wollte, waren in 3 verschiedenen geschachtelten JSON-Objekten.

So war meine Lösung, mich noch mehr Trauer zu retten und einfach den JSON durch einen hübschen Drucker und schaute und die Struktur richtig.

Hier ist mein Lösungscode:

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: Immer einen Pretty Printer auf Ihrem JSON verwenden und es zu schätzen weiß Struktur ist, bevor Sie etwas tun. Ich schwöre, das wird mir nicht wieder passieren.

+0

Wenn die Antwort für Sie funktioniert, markieren Sie sie als akzeptiert, damit sie anderen helfen kann, die nach derselben Sache suchen. :) – Spudley

+0

Ja, das hat mich wirklich für eine Weile wie ein Idiot gefühlt. Ich werde es akzeptieren, wenn es mir erlaubt. Danke viel Leute! :) –

+0

Haben Sie immer noch die JAR-Datei? Ich kann das json-me-Glas nirgendwo finden: S – eddy

0

Sie können die JSON Zeichenfolge durch das folgende Beispiel

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

Vielen Dank, sieht sauberer als das, was ich versuchte. Ich denke, ich habe das Problem gelöst. Es war mehr ich, nicht die JSON-Struktur richtig lesen. –