2012-08-05 9 views
5

그래서이 중첩 JSON 문자열을 구문 분석하려고했습니다. 이것이 정규 자바 또는 PHP 일지라도, 나는 이것이 오래전에 이루어 졌을 것이라고 확신한다. 불행히도이 J2ME에 붙어 있습니다. 일부 검색을 통해 나는 lone JSON parser이 있다는 것을 알았습니다. 이 부분은 similar question에서 파고 들었습니다. another question에 대한 예제와 함께 독자적으로 몇 가지 작업을 시도했습니다. 그러나, 나는 아직도 약간 어려움이있다. 나는 지금 설명 할 것이다.J2ME에서 JSON 구문 분석

이것은 내가 구문 분석하는 데 노력하고있어 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

보이 다음의 예에 의해 JSON 문자열을 구문 분석 나 자신을 촬영하고자 할 수 있습니다. 나는 침대에 가기 전에 문제를 알아 냈습니다. 나의 접근 방식은 정확했다. JSON이 중첩 된 방식을 과소 평가했을뿐만 아니라 잘못된 인쇄 문장의 출력을 읽는 것은 저의 문제였습니다.

내부적으로 JSONOBject 클래스는 JSON 요소, 쌍 등을 Hashtable에 저장합니다. Hashtable에는 주어진 데이터를 정렬하는 부작용이 있습니다. 물론 JSON이 어떻게 주문되었는지 살펴 보겠습니다. 나는 JSON의 일부를 소비하고있는 것으로 생각했다. 실제로 JSON의 끝 부분이 아니라면 뒤로 물러 설 수 있었다. 이것은 나를 통해 크게. 방금 Hashtable에서 toString을 실행할 때까지이 사실을 알지 못했습니다. 나는 또한 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에 예쁜 프린터를 사용하고, 아무것도 전에 구조이다 주셔서 감사합니다. 나는이 일이 내게 다시 일어나지 않을 것을 맹세한다.

+0

대답이 당신을 위해 작동한다면, 그것이 같은 것을 검색하는 다른 사람들을 도울 수 있도록 그것을 인정 된 것으로 표시하십시오. :) – Spudley

+0

그래, 이건 정말 내 바보처럼 느껴졌다. 나는 그것을 허용 할 때 그것을 받아 들일 것이다. 고마워요! :) –

+0

아직도 jar 파일이 있습니까? 나는 json-me jar를 찾을 수 없다. S – eddy

0

당신은,

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

감사합니다. 내가 시도한 것보다 훨씬 깨끗해 보입니다. 나는 그 문제를 해결했다고 생각한다. JSON 구조를 제대로 읽지 않은 것은 저였습니다. –