Разбор Android и json
У меня есть приложение для Android, которое получает строку JSON.
[
{
"apellidos": "seguro",
"edad": 2,
"idninos": 1,
"nombre": "antonio",
"padres": "n1"
},
{
"apellidos": "martinez",
"edad": 2,
"idninos": 2,
"nombre": "sebastian",
"padres": "n2"
},
{
"apellidos": "lopez",
"edad": 2,
"idninos": 3,
"nombre": "francisaca",
"padres": "n3"
},
{
"apellidos": "maroto",
"edad": 2,
"idninos": 4,
"nombre": "gregoria",
"padres": "n4"
},
{
"apellidos": "maroto",
"edad": 2,
"idninos": 5,
"nombre": "javier",
"padres": "n4"
},
{
"apellidos": "ramirez",
"edad": 1,
"idninos": 6,
"nombre": "andrea",
"padres": "n5"
},
{
"apellidos": "leal",
"edad": 1,
"idninos": 7,
"nombre": "jorge",
"padres": "n6"
},
{
"apellidos": "rodriguez",
"edad": 2,
"idninos": 8,
"nombre": "antonio",
"padres": "n7"
},
{
"apellidos": "gomez",
"edad": 2,
"idninos": 9,
"nombre": "jaime",
"padres": "n8"
},
{
"apellidos": "jimenez",
"edad": 2,
"idninos": 10,
"nombre": "nerea",
"padres": "n9"
},
{
"apellidos": "gutierrez",
"edad": 2,
"idninos": 11,
"nombre": "paquito",
"padres": "n12"
},
{
"apellidos": "esteso",
"edad": 2,
"idninos": 12,
"nombre": "tomas",
"padres": "n15"
}
]
И я показываю это таким образом: я показываю в listview
;
public class MainActivity extends ListActivity {
private static final String LOGTAG = "LogsAndroid";
static String id;
EditText eTetx1;
//contexto
private Context context;
//url
private static String
url="http://192.168.1.33:8080/WSBaby1/webresources/com.gleegoo.ws.ninos/";
//variable de json
private static final String TAG_NOMBRE="nombre";
private static final String TAG_APELLIDO="apellidos";
//lista arrays desplegables
ArrayList<HashMap<String,String>> jsonlist= new ArrayList<HashMap<String,String>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//llamando la actividad
new GetJSONActivity(MainActivity.this).execute();
eTetx1 = (EditText) findViewById(R.id.editText1);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class GetJSONActivity extends AsyncTask<String, Void, String>{
private ListActivity activity;
public GetJSONActivity(ListActivity activity){
this.activity=activity;
context = activity;
}
@Override
protected String doInBackground(String... params) {
JSONParser jParser = new JSONParser();
//getting JSON string from url
JSONArray json = jParser.GetJSONfromUrl(url);
for (int i = 0; i < json.length(); i++) {
try {
JSONObject c = json.getJSONObject(i);
String vpeli=c.getString(TAG_NOMBRE);
String apell=c.getString(TAG_APELLIDO);
HashMap<String, String> map = new HashMap<String, String>();
//
map.put(TAG_NOMBRE, vpeli);
map.put(TAG_APELLIDO, apell);
jsonlist.add(map);
} catch (JSONException e) {
// TODO: handle exception
e.printStackTrace();
return "Error creando variables";
}
}
return "EXITO";
}
@Override
protected void onPostExecute(String success){
ListAdapter adapter = new SimpleAdapter(context, jsonlist,R.layout.items, new String[] {TAG_NOMBRE,TAG_APELLIDO}, new int[]{R.id.nombre,R.id.tipo});
setListAdapter(adapter);
//selecting single listview
getListView();
}
Ну, это работает отлично, моя проблема заключается в следующем: если я хочу показать, например, все данные с идентификатором, idnino
например 3.{"apellidos":"lopez","edad":2,"idninos":3,"nombre":"francisaca","padres":"n3"}
Он думал об изменении URL и поместил это:
private static String url="http://192.168.1.33:8080/WSBaby1/webresources/com.gleegoo.ws.ninos/3
Но я получаю это, но не могу показать это.. Это мой logcat:
04-01 12:43:51.165: E/JSON Parser(17792): Error traduciendo
datosorg.json.JSONException: Value
{"nombre":"francisaca","padres":"n3","idninos":3,"apellidos":"lopez","edad":2} of type
org.json.JSONObject cannot be converted to JSONArray
04-01 12:43:51.175: W/dalvikvm(17792): threadid=12: thread exiting with uncaught
exception (group=0x419612a0)
04-01 12:43:51.240: E/AndroidRuntime(17792): FATAL EXCEPTION: AsyncTask #1
04-01 12:43:51.240: E/AndroidRuntime(17792): java.lang.RuntimeException: An error
occured while executing doInBackground()
04-01 12:43:51.240: E/AndroidRuntime(17792): at android.os.AsyncTask$3.done(AsyncTask.java:299)
04-01 12:43:51.240: E/AndroidRuntime(17792): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
04-01 12:43:51.240: E/AndroidRuntime(17792): at
java.util.concurrent.FutureTask.setException(FutureTask.java:124)
04-01 12:43:51.240: E/AndroidRuntime(17792): at
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
04-01 12:43:51.240: E/AndroidRuntime(17792): at
java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-01 12:43:51.240: E/AndroidRuntime(17792): at
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
04-01 12:43:51.240: E/AndroidRuntime(17792): at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
04-01 12:43:51.240: E/AndroidRuntime(17792): at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
04-01 12:43:51.240: E/AndroidRuntime(17792): at
java.lang.Thread.run(Thread.java:856)
04-01 12:43:51.240: E/AndroidRuntime(17792): Caused by: java.lang.NullPointerException
04-01 12:43:51.240: E/AndroidRuntime(17792): at
com.example.jsonprueba.MainActivity$GetJSONActivity.doInBackground(MainActivity.java:65)
04-01 12:43:51.240: E/AndroidRuntime(17792): at
com.example.jsonprueba.MainActivity$GetJSONActivity.doInBackground(MainActivity.java:1)
04-01 12:43:51.240: E/AndroidRuntime(17792): at
android.os.AsyncTask$2.call(AsyncTask.java:287)
04-01 12:43:51.240: E/AndroidRuntime(17792): at
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-01 12:43:51.240: E/AndroidRuntime(17792): ... 5 more
3 ответа
Это JSONArray
и не JSONObject
- сделать JSONObject
из него используйте
JSONObject jsonObject = jsonArray.getJSONObject(0);
это получает первый JSONObject из этого JSONArray.
Если у вас есть несколько JSONObjects, используйте это:
JSONObject jsonObject;
for(int n = 0; n < jsonArray.length(); n++)
{
jsonObject = jsonArray.getJSONObject(n);
}
Чтобы получить значения:
jsonObject.getString("name");
Вы пытаетесь проанализировать JSON как массив
JSONArray json = jParser.GetJSONfromUrl(url);
но ваш JSON является объектом
{
"apellidos": "lopez",
"edad": 2,
"idninos": 3,
"nombre": "francisaca",
"padres": "n3"
}
ваш JSON должен быть массивом только с одним объектом
[{
"apellidos": "lopez",
"edad": 2,
"idninos": 3,
"nombre": "francisaca",
"padres": "n3"
}]
Вы можете попытаться проверить, является ли объект результата массивом или объектом, подобным этому
Object jsonResultObject = jParser.GetJSONfromUrl(url);
if (jsonResultObject!=null) {
if (jsonResultObject instanceof JSONArray) {
......
}else if (jsonResultObject instanceof JSONObject) {
.....
}else{
throw new Exception("The result object is not a JSON object or an Array");
}
}
Удалите массив из вашей кодировки и сделайте это с объектом, так как JSON, который вы показали, относится к объектам, а не к массивам.
Массивы начинаются с [ ] объектов с { }
Ваш JSON начинается с массива, а элементы внутри него находятся в массивах.