2012-08-05 16 views
5

Por lo tanto, hace tiempo que intento analizar esta cadena JSON anidada. Si esto fuera Java regular, o incluso php, estoy seguro de que esto se hubiera hecho hace mucho tiempo. Lamentablemente estoy atascado con J2ME en este caso. A través de una búsqueda encontré que existe un lone JSON parser. Esto lo encontré a través de algunas excavaciones en un similar question. Intenté trabajar por mi cuenta, con un ejemplo en another question. Sin embargo, sigo teniendo algunas dificultades. Voy a explicar ahora.Analizando JSON en J2ME

Ésta es la cadena JSON que estoy tratando de analizar:

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

No se preocupe esto es sólo datos de la muestra, nada real aquí.

Ahora requiero el saldo de la cuenta de ahorros, el nombre, la dirección y el nombre del cliente. Este es el código que he usado para analizarlo:

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

Por supuesto, arroja una excepción JSONException. Aprendí que la Biblioteca JSON puede tener algunos errores. He hecho algunos trucos, con declaraciones impresas. Resulta que le gusta consumir el primer elemento de la cadena JSON. Esto se arruina al pasar por elementos anidados como los que tenemos aquí en el ejemplo.

¿Existe alguna alternativa que pueda usar?

Respuesta

4

Boy, es lo que quiero pegarme un tiro. Descubrí mi problema antes de irme a la cama. Mi enfoque fue correcto; solo fue cuestión de que leyera erróneamente el resultado de las declaraciones impresas y subestimase qué tan anidado estaba el JSON.

Internamente, la clase JSONOBject almacena los elementos JSON, pares, etc. en una tabla Hashtable. El Hashtable tiene un efecto secundario en el que clasificará los datos que se le dan. Esto, por supuesto, a través de cómo se ordenó el JSON. Pensé que estaba consumiendo algunas partes del JSON, mientras que realmente solo las estaba poniendo en la parte posterior ... el waaay de vuelta si no el final del JSON. Esto en gran medida a través de mí. No me di cuenta de esto hasta que me encontré con String on the Hashtable. Luego también me di cuenta de que el JSON en realidad estaba más anidado de lo que pensaba. Las cuatro partes que quería obtener, en 3 objetos JSON anidados diferentes.

Por lo tanto, mi solución fue salvarme aún más la pena y simplemente poner el JSON a través de una impresora bonita y miró y la estructura correctamente.

Aquí está mi código Solución:

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: Siempre use una impresora bonita en su JSON, y apreciar su estructura antes de hacer nada. Juro que esto no me pasará de nuevo.

+0

si la respuesta le funciona, márquela como aceptada para que pueda ayudar a otras personas que busquen lo mismo. :) – Spudley

+0

Sí, esto realmente me hizo sentir como un idiota por un tiempo. Lo aceptaré cuando me lo permita. Muchas gracias chicos! :) –

+0

¿Todavía tiene el archivo jar? No puedo encontrar el json-me jar en ninguna parte: S – eddy

0

Usted puede analizar la cadena JSON con el siguiente ejemplo

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

Muchas gracias, se ve más limpio que lo que estaba intentando. Creo que he resuelto el problema. Era más yo, no leyendo correctamente la estructura JSON. –