POZNÁMKA :jak bylo uvedeno v předchozí otázce, daný řetězec JSON musí být ve správném formátu, tj. buď mít klíč pro každý objekt (přihlášení, účty), nebo je mít v jednom poli (vstup). Nabízím řešení pro obě možnosti.
Nováčku, poskytuji vám 2 samostatné metody, abyste mohli zpracovat příchozí řetězec JSON v závislosti na tom, jak jej zkonstruujete, buď 2 objekty v jednom řetězci JSON, nebo 2 objekty v poli JSON.
Můžete si vybrat řešení :)
Vyzkoušejte kód, dejte mi vědět, pokud potřebujete další pomoc, a přijměte odpověď.
OPTION1 :2 objekty v jednom řetězci JSON
{
"login":{
"error":false,
"user":{
"br_code":12,
"mem_id":13,
"username":"novalyn",
"email":"[email protected]",
"created_at":"2016-07-22 09:05:21"
}
},
"accounts":{
"error":false,
"sl_summ":[
{
"sl_desc":"PA : Savings Account",
"tr_date":"2015-08-17",
"actual_balance":"483.67",
"available_balance":"483.67"
},
{
"sl_desc":"PA : Savings - Cash Bond",
"tr_date":"2015-08-28",
"actual_balance":"10129.43",
"available_balance":"10129.43"
}
]
}
}
OPTION2 :2 objekty v jediném řetězci pole JSON
{
"input":[
{
"error":false,
"user":{
"br_code":12,
"mem_id":13,
"username":"novalyn",
"email":"[email protected]",
"created_at":"2016-07-22 09:05:21"
}
},
{
"error":false,
"sl_summ":[
{
"sl_desc":"PA : Savings Account",
"tr_date":"2015-08-17",
"actual_balance":"483.67",
"available_balance":"483.67"
},
{
"sl_desc":"PA : Savings - Cash Bond",
"tr_date":"2015-08-28",
"actual_balance":"10129.43",
"available_balance":"10129.43"
}
]
}
]
}
Kód pro zpracování obou scénářů (OPTION1 a OPTION2) JSON String
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public static void jsonExample() {
// OPTION 1
String twoObjectString = "{ \"login\":{ \"error\":false, \"user\":{ \"br_code\":12, \"mem_id\":13, \"username\":\"novalyn\", \"email\":\"[email protected]\", \"created_at\":\"2016-07-22 09:05:21\" } }, \"accounts\":{ \"error\":false, \"sl_summ\":[ { \"sl_desc\":\"PA : Savings Account\", \"tr_date\":\"2015-08-17\", \"actual_balance\":\"483.67\", \"available_balance\":\"483.67\" }, { \"sl_desc\":\"PA : Savings - Cash Bond\", \"tr_date\":\"2015-08-28\", \"actual_balance\":\"10129.43\", \"available_balance\":\"10129.43\" } ] } }\n";
// OPTION 2
String arrayString = "{ \"input\": [ { \"error\":false, \"user\":{ \"br_code\":12, \"mem_id\":13, \"username\":\"novalyn\", \"email\":\"[email protected]\", \"created_at\":\"2016-07-22 09:05:21\" } }, { \"error\":false, \"sl_summ\":[ { \"sl_desc\":\"PA : Savings Account\", \"tr_date\":\"2015-08-17\", \"actual_balance\":\"483.67\", \"available_balance\":\"483.67\" }, { \"sl_desc\":\"PA : Savings - Cash Bond\", \"tr_date\":\"2015-08-28\", \"actual_balance\":\"10129.43\", \"available_balance\":\"10129.43\" } ] } ] }\n";
try {
Log.d("TEST", "COMBINED 2 OBJECTS ");
Log.d("TEST", "INPUT String : " + twoObjectString);
JSONObject twoJSONObjects = new JSONObject(twoObjectString);
handleTwoObjects(twoJSONObjects);
Log.d("TEST", "2 OBJECTS IN ARRAY ");
Log.d("TEST", "INPUT String " + arrayString);
JSONObject arrayJSONObject = new JSONObject(arrayString);
handleArrayOfObjects(arrayJSONObject);
} catch (Exception exception) {
Log.d("TEST", exception.toString());
}
}
// OPTION 1
public static void handleTwoObjects(JSONObject jsonObject) throws Exception {
// read the json string into a json object
Log.d("TEST", "JSON String : " + jsonObject.toString());
if (!jsonObject.isNull("login")) {
JSONObject loginObject = (JSONObject) jsonObject.get("login");
// access individual json object thru jsonObject.get("FIELD_NAME")
Log.d("TEST", "-error attribute : " + loginObject.get("error").toString());
// Check if its login data i.e. user present
if (!loginObject.isNull("user")) {
// handle user login data
JSONObject userJSONObject = (JSONObject) loginObject.get("user");
Log.d("TEST", "User : " + userJSONObject.toString());
Log.d("TEST", "-br_code attribute : " + userJSONObject.get("br_code").toString());
Log.d("TEST", "-mem_id attribute : " + userJSONObject.get("mem_id").toString());
Log.d("TEST", "-username attribute : " + userJSONObject.get("username").toString());
Log.d("TEST", "-email attribute : " + userJSONObject.get("email").toString());
Log.d("TEST", "-created_at attribute : " + userJSONObject.get("created_at").toString());
// Check if its account data i.e. sl_summ is present
} else {
// a new JSON string that doesn't have user in login Object
Log.d("TEST", "Unknown JSON String : " + loginObject.toString());
}
}
if (!jsonObject.isNull("accounts")) {
JSONObject accountsObject = (JSONObject) jsonObject.get("accounts");
// access individual json object thru jsonObject.get("FIELD_NAME")
Log.d("TEST", "-error attribute : " + accountsObject.get("error").toString());
JSONArray slArray = accountsObject.optJSONArray("sl_summ");
// Check if its login data i.e. user present
if (slArray != null) {
// handle account data
JSONArray array = ((JSONArray)accountsObject.getJSONArray("sl_summ"));
// access individual json array thru jsonObject.getJSONArray("FIELD_NAME")
Log.d("TEST", "-sl_summ array : " + accountsObject.getJSONArray("sl_summ").toString());
for (int index=0; index<array.length(); index++) {
JSONObject object = (JSONObject)array.get(index);
Log.d("TEST", "-sl_desc attribute : " + object.get("sl_desc").toString());
Log.d("TEST", "-tr_date attribute : " + object.get("tr_date").toString());
Log.d("TEST", "-actual_balance attribute : " + object.get("actual_balance").toString());
Log.d("TEST", "-available_balance attribute : " + object.get("available_balance").toString());
Log.d("TEST", "---------------------------------");
}
} else {
// a new JSON string that doesn't have sl_summ as member variable so display it and write new handler code
Log.d("TEST", "Unknown JSON String : " + jsonObject.toString());
}
}
}
// OPTION 2
public static void handleArrayOfObjects(JSONObject jsonObject) throws Exception {
// read the json string into a json object
Log.d("TEST", "JSON String : " + jsonObject.toString());
JSONArray inputArray = jsonObject.optJSONArray("input");
if (inputArray != null && inputArray.length() > 0) {
for (int oindex = 0; oindex < inputArray.length(); oindex++) {
JSONObject currentObject = (JSONObject) inputArray.get(oindex);
JSONArray slArray = currentObject.optJSONArray("sl_summ");
// access individual json object thru jsonObject.get("FIELD_NAME")
Log.d("TEST", "-error attribute : " + currentObject.get("error").toString());
// Check if its login data i.e. user present
if (!currentObject.isNull("user") && slArray == null) {
// handle user login data
JSONObject userJSONObject = (JSONObject) currentObject.get("user");
Log.d("TEST", "User : " + userJSONObject.toString());
Log.d("TEST", "-br_code attribute : " + userJSONObject.get("br_code").toString());
Log.d("TEST", "-mem_id attribute : " + userJSONObject.get("mem_id").toString());
Log.d("TEST", "-username attribute : " + userJSONObject.get("username").toString());
Log.d("TEST", "-email attribute : " + userJSONObject.get("email").toString());
Log.d("TEST", "-created_at attribute : " + userJSONObject.get("created_at").toString());
// Check if its account data i.e. sl_summ is present
} else if (slArray != null && currentObject.isNull("user")) {
// handle account data
JSONArray array = ((JSONArray)currentObject.getJSONArray("sl_summ"));
// access individual json array thru jsonObject.getJSONArray("FIELD_NAME")
Log.d("TEST", "-sl_summ array : " + currentObject.getJSONArray("sl_summ").toString());
for (int index=0; index<array.length(); index++) {
JSONObject object = (JSONObject)array.get(index);
Log.d("TEST", "-sl_desc attribute : " + object.get("sl_desc").toString());
Log.d("TEST", "-tr_date attribute : " + object.get("tr_date").toString());
Log.d("TEST", "-actual_balance attribute : " + object.get("actual_balance").toString());
Log.d("TEST", "-available_balance attribute : " + object.get("available_balance").toString());
Log.d("TEST", "---------------------------------");
}
} else {
// a new JSON string that doesn't have user or sl_summ as member variable so display it and write new handler code
Log.d("TEST", "Unknown JSON String : " + jsonObject.toString());
}
}
}
}
Ukázkové protokoly pro OPTION1 a OPTION2
07-05 20:21:58.001 8178-8178/? D/TEST: COMBINED 2 OBJECTS
07-05 20:21:58.001 8178-8178/? D/TEST: INPUT String : { "login":{ "error":false, "user":{ "br_code":12, "mem_id":13, "username":"novalyn", "email":"[email protected]", "created_at":"2016-07-22 09:05:21" } }, "accounts":{ "error":false, "sl_summ":[ { "sl_desc":"PA : Savings Account", "tr_date":"2015-08-17", "actual_balance":"483.67", "available_balance":"483.67" }, { "sl_desc":"PA : Savings - Cash Bond", "tr_date":"2015-08-28", "actual_balance":"10129.43", "available_balance":"10129.43" } ] } }
07-05 20:21:58.001 8178-8178/? D/TEST: JSON String : {"login":{"error":false,"user":{"br_code":12,"mem_id":13,"username":"novalyn","email":"[email protected]","created_at":"2016-07-22 09:05:21"}},"accounts":{"error":false,"sl_summ":[{"sl_desc":"PA : Savings Account","tr_date":"2015-08-17","actual_balance":"483.67","available_balance":"483.67"},{"sl_desc":"PA : Savings - Cash Bond","tr_date":"2015-08-28","actual_balance":"10129.43","available_balance":"10129.43"}]}}
07-05 20:21:58.001 8178-8178/? D/TEST: -error attribute : false
07-05 20:21:58.001 8178-8178/? D/TEST: User : {"br_code":12,"mem_id":13,"username":"novalyn","email":"[email protected]","created_at":"2016-07-22 09:05:21"}
07-05 20:21:58.001 8178-8178/? D/TEST: -br_code attribute : 12
07-05 20:21:58.001 8178-8178/? D/TEST: -mem_id attribute : 13
07-05 20:21:58.001 8178-8178/? D/TEST: -username attribute : novalyn
07-05 20:21:58.001 8178-8178/? D/TEST: -email attribute : [email protected]
07-05 20:21:58.001 8178-8178/? D/TEST: -created_at attribute : 2016-07-22 09:05:21
07-05 20:21:58.001 8178-8178/? D/TEST: -error attribute : false
07-05 20:21:58.001 8178-8178/? D/TEST: -sl_summ array : [{"sl_desc":"PA : Savings Account","tr_date":"2015-08-17","actual_balance":"483.67","available_balance":"483.67"},{"sl_desc":"PA : Savings - Cash Bond","tr_date":"2015-08-28","actual_balance":"10129.43","available_balance":"10129.43"}]
07-05 20:21:58.002 8178-8178/? D/TEST: -sl_desc attribute : PA : Savings Account
07-05 20:21:58.002 8178-8178/? D/TEST: -tr_date attribute : 2015-08-17
07-05 20:21:58.002 8178-8178/? D/TEST: -actual_balance attribute : 483.67
07-05 20:21:58.002 8178-8178/? D/TEST: -available_balance attribute : 483.67
07-05 20:21:58.002 8178-8178/? D/TEST: ---------------------------------
07-05 20:21:58.002 8178-8178/? D/TEST: -sl_desc attribute : PA : Savings - Cash Bond
07-05 20:21:58.002 8178-8178/? D/TEST: -tr_date attribute : 2015-08-28
07-05 20:21:58.002 8178-8178/? D/TEST: -actual_balance attribute : 10129.43
07-05 20:21:58.002 8178-8178/? D/TEST: -available_balance attribute : 10129.43
07-05 20:21:58.002 8178-8178/? D/TEST: ---------------------------------
07-05 20:21:58.002 8178-8178/? D/TEST: 2 OBJECTS IN ARRAY
07-05 20:21:58.002 8178-8178/? D/TEST: INPUT String { "input": [ { "error":false, "user":{ "br_code":12, "mem_id":13, "username":"novalyn", "email":"[email protected]", "created_at":"2016-07-22 09:05:21" } }, { "error":false, "sl_summ":[ { "sl_desc":"PA : Savings Account", "tr_date":"2015-08-17", "actual_balance":"483.67", "available_balance":"483.67" }, { "sl_desc":"PA : Savings - Cash Bond", "tr_date":"2015-08-28", "actual_balance":"10129.43", "available_balance":"10129.43" } ] } ] }
07-05 20:21:58.002 8178-8178/? D/TEST: JSON String : {"input":[{"error":false,"user":{"br_code":12,"mem_id":13,"username":"novalyn","email":"[email protected]","created_at":"2016-07-22 09:05:21"}},{"error":false,"sl_summ":[{"sl_desc":"PA : Savings Account","tr_date":"2015-08-17","actual_balance":"483.67","available_balance":"483.67"},{"sl_desc":"PA : Savings - Cash Bond","tr_date":"2015-08-28","actual_balance":"10129.43","available_balance":"10129.43"}]}]}
07-05 20:21:58.002 8178-8178/? D/TEST: -error attribute : false
07-05 20:21:58.002 8178-8178/? D/TEST: User : {"br_code":12,"mem_id":13,"username":"novalyn","email":"[email protected]","created_at":"2016-07-22 09:05:21"}
07-05 20:21:58.002 8178-8178/? D/TEST: -br_code attribute : 12
07-05 20:21:58.002 8178-8178/? D/TEST: -mem_id attribute : 13
07-05 20:21:58.002 8178-8178/? D/TEST: -username attribute : novalyn
07-05 20:21:58.002 8178-8178/? D/TEST: -email attribute : [email protected]
07-05 20:21:58.002 8178-8178/? D/TEST: -created_at attribute : 2016-07-22 09:05:21
07-05 20:21:58.002 8178-8178/? D/TEST: -error attribute : false
07-05 20:21:58.002 8178-8178/? D/TEST: -sl_summ array : [{"sl_desc":"PA : Savings Account","tr_date":"2015-08-17","actual_balance":"483.67","available_balance":"483.67"},{"sl_desc":"PA : Savings - Cash Bond","tr_date":"2015-08-28","actual_balance":"10129.43","available_balance":"10129.43"}]
07-05 20:21:58.002 8178-8178/? D/TEST: -sl_desc attribute : PA : Savings Account
07-05 20:21:58.002 8178-8178/? D/TEST: -tr_date attribute : 2015-08-17
07-05 20:21:58.002 8178-8178/? D/TEST: -actual_balance attribute : 483.67
07-05 20:21:58.002 8178-8178/? D/TEST: -available_balance attribute : 483.67
07-05 20:21:58.002 8178-8178/? D/TEST: ---------------------------------
07-05 20:21:58.002 8178-8178/? D/TEST: -sl_desc attribute : PA : Savings - Cash Bond
07-05 20:21:58.002 8178-8178/? D/TEST: -tr_date attribute : 2015-08-28
07-05 20:21:58.002 8178-8178/? D/TEST: -actual_balance attribute : 10129.43
07-05 20:21:58.002 8178-8178/? D/TEST: -available_balance attribute : 10129.43
07-05 20:21:58.002 8178-8178/? D/TEST: ---------------------------------
Nemám přístup ke všem interním souborům PHP, které mohu použít ke spuštění vašeho kódu PHP, takže jsem většinu všech volání funkcí nahradil pevně zakódovanými hodnotami sdílenými v užitečné zátěži vzorové odpovědi. Zde je kód pro generování objektů JSON ve formátu OPTION1.
Stručně řečeno, musíte přidat ["login"] a ["accounts"] před všechny dílčí atributy v $response, aby byly seskupeny do správného objektu JSON a budete mít dva objekty JSON, které lze analyzovat výše sdílený kód Android.
<?php
// json response array
$br_response = array("error" => FALSE);
$sl_response["error"] = FALSE;
$sl_response["sl_summ"] = array();
$arclass = "13";
$loanclass = "12";
$accintreceivable = "21";
// user is found
$response["login"]["error"] = FALSE;
$response["login"]["user"]["br_code"] = 12;
$response["login"]["user"]["mem_id"] = 13;
$response["login"]["user"]["username"] = "novalyn";
$response["login"]["user"]["email"] = "[email protected]";
$response["login"]["user"]["created_at"] = "2016-07-22 09:05:21";
for($i = 0; $i < 2; $i++){
$item = array();
$item["sl_desc"] = "PA : Savings Account";
$item["tr_date"] = "2015-08-17";
$item["actual_balance"] = "483.67";
$item["available_balance"] = "483.67";
$sl_response["sl_summ"][] = $item;
}
$response["accounts"] = $sl_response;
json_encode($response);
echo json_encode($response, true);
Spuštění vzorku PHP vygenerovalo odpověď JSON (OPTION1)
{
"login":{
"error":false,
"user":{
"br_code":12,
"mem_id":13,
"username":"novalyn",
"email":"[email protected]",
"created_at":"2016-07-22 09:05:21"
}
},
"accounts":{
"error":false,
"sl_summ":[
{
"sl_desc":"PA : Savings Account",
"tr_date":"2015-08-17",
"actual_balance":"483.67",
"available_balance":"483.67"
},
{
"sl_desc":"PA : Savings Account",
"tr_date":"2015-08-17",
"actual_balance":"483.67",
"available_balance":"483.67"
}
]
}
}
Kód bude k dispozici několik dní na https://codepad.remoteinterview.io/YJJKVUEAAH