2012-08-05 20 views
5

Próbowałem przez jakiś czas przeanalizować ten zagnieżdżony ciąg JSON. Gdyby to była zwykła Java, czy nawet php, jestem pewien, że to by było zrobione dawno temu. Niestety utknąłem z J2ME na tym. Dzięki pewnym poszukiwaniom okazało się, że kończy się lone JSON parser. Znalazłem to przez kopanie na similar question. Próbowałem trochę pracy na własną rękę, z przykładem na another question. Jednak wciąż mam kilka trudności. Wyjaśnię teraz.Parsowanie JSON w J2ME

Jest to ciąg JSON Próbuję analizować:

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

nie martw się to tylko przykładowe dane, nic prawdziwy tutaj.

Teraz wymagam od konta klientów No, Name, Address i Savings Account. Jest to kod Używałem go do analizowania:

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

To oczywiście rzuca JSONException. Dowiedziałem się, że biblioteka JSON może mieć kilka błędów. Zrobiłem kilka sztuczek, z instrukcjami drukowania. Okazuje się, że lubi spożywać pierwszy element ciągu JSON. To mocno wkręca się w zagnieżdżone elementy, jak to mamy tutaj w przykładzie.

Czy istnieje alternatywa, której mogę użyć?

Odpowiedz

4

Boy, chcę strzelać sobie. Zanim poszedłem do łóżka, wymyśliłem swój problem. Moje podejście było poprawne; było to tylko kwestią mnie, jak źle odczytałem wyniki wyciągów Print, a także nie doceniłem, jak zagnieżdżony był JSON.

Wewnętrznie, klasa JSONOBject przechowuje elementy JSON, pary itp. W tabeli Hashtable. Hashtable ma efekt uboczny, w którym sortuje dane, które zostały mu dane. To oczywiście przez to, w jaki sposób zamówiono JSON. Pomyślałem, że spożywanie niektórych części JSON, a tak naprawdę po prostu umieszczając je na plecy ... z powrotem waaay jeśli nie do końca JSON. To bardzo przeze mnie. Nie zdawałem sobie z tego sprawy, dopóki nie rzuciłem się na Sstringa na samym Hashtable. Wtedy też zdaję sobie sprawę, że JSON był w rzeczywistości bardziej zagnieżdżony niż myślałem. Cztery części, które chciałem uzyskać, w 3 różnych zagnieżdżonych obiektach JSON.

Tak więc, moim rozwiązaniem było zaoszczędzić sobie jeszcze więcej żalu i po prostu włożyć JSON przez ładną drukarkę, a wygląd i strukturę prawidłowo.

Oto mój kod Rozwiązanie:

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: Zawsze należy używać drukarki w swojej dosyć JSON, i docenić to struktura, zanim zrobisz cokolwiek. Przysięgam, że to mi się nie przytrafi.

+0

jeśli odpowiedź pracuje dla ciebie, oznaczyć ją jako akceptowane więc może pomóc innym, którzy szuka tej samej rzeczy. :) – Spudley

+0

Tak, to naprawdę miał mnie czując się jak idiota na chwilę. Przyjmę to, kiedy pozwoli mi. Wielkie dzięki! :) –

+0

Czy nadal masz plik jar? Nie mogę znaleźć słoika json-me gdziekolwiek: S – eddy

0

można analizować ciąg JSON następujący przykład

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

Dzięki dużo, wygląda czystsze niż to, co starałem. Myślę, że rozwiązałem problem. To było bardziej ja, nie czytając właściwej struktury JSON. –