Error JSONException: No Value For - java

i want show data with jsonarray
my code activity
params.add(new BasicNameValuePair("id_gadai", id_gadai));
// getting JSON string from URL
String json = jsonParser.makeHttpRequest(URL_GADAI_DETAIL, "GET",
params);
// Check your log cat for JSON reponse
Log.d("Data Gadai Detail: ", json);
try {
JSONObject jObj = new JSONObject(json);
if(jObj != null){
nama_brg = jObj.getString(TAG_NAMA_BRG);
taksiran = jObj.getString(TAG_TAKSIRAN);
pinjaman = jObj.getString(TAG_PINJAMAN);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
my jsonarray from database
{"data_gadai_detail":[{"id_gadai":"3","nama_brg":"BERLIAN L FINE GOLD
BERSERTIFIKAT NO.SERI JS 006 DTM 24K BRT 10
GRAM","pinjaman":"2000000","taksiran":"4000000","tgl_bts_tebus":"05-May-2013","tgl_bts_lelang":"09-May-2013"}]}
show error :
Error JSONException: No Value For nama_brg
Need help for my problem. thks

Your JSON represents an object with one single field: data_gadai_detail:
{"data_gadai_detail": ...}
The value of this field is an array with a single element:
{"data_gadai_detail": [...]}
This single element is an object with several fields, one of them being nama_brg.
So your code should first get the field data_gadai_detail as an array, take the first element of this array as another JSON object, and finally get the String nama_brg in this object.

You have a JSONArray named "data_gadai_detail" as root, then you need to get the first JSONObject and then you can get the JSONStrings
try this:
JSONObject jObj = new JSONObject(json);
if(jObj != null){
nama_brg = jObj.getJSONArray("data_gadai_detail").getJSONObject(0).getString(TAG_NAMA_BRG);
taksiran = jObj.getJSONArray("data_gadai_detail").getJSONObject(0).getString(TAG_TAKSIRAN);
pinjaman = jObj.getJSONArray("data_gadai_detail").getJSONObject(0).getString(TAG_PINJAMAN);
}

try this one..
JSONObject jObj = new JSONObject(json);
JSONArray arr = jObj.getJSONArray("data_gadai_detail");
for (int i = 0; i < arr.length(); i++) {
JSONObject c = arr.getJSONObject(i);
nama_brg = c.getString(TAG_NAMA_BRG);
taksiran = c.getString(TAG_TAKSIRAN);
pinjaman = c.getString(TAG_PINJAMAN);
}

Related

Java get nested JSON object/array

Code used:
jObj = new JSONObject(json);
newJSONString = jObj.getString("payload");
JArray = new JSONArray(newJSONString);
This is what JArray looks like:
[{"06:30:00":{"color":"grey","time_color":"black"},"06:45:00":{"color":"grey","time_color":"black"}}]
Now I want to loop through the received times and print their color, how to do this?
What I've tried:
for (int i = 0; i < JArray.length(); ++i) {
JSONObject rec = null;
try {
rec = JArray.getJSONObject(i);
} catch (JSONException e) {
e.printStackTrace();
}
android.util.Log.e("print row:", String.valueOf(rec));
}
This just gives me this output:
{"06:30:00":{"color":"grey","time_color":"black"},"06:45:00":{"color":"grey","time_color":"black"}}
You are getting this output since your JSON array contains only one JSON object which is - {"06:30:00":{"color":"grey","time_color":"black"},"06:45:00":{"color":"grey","time_color":"black"}}
Before answering your question, I would recommend you to go through JSON syntax. It will help you understand your question and answer effectively.
Coming back to your question, in order to get "color" field from your nested JSON:
Traverse through keys in your JSON object. In your case these are -
"06:30:00" , "06:45:00". You can google out solution to traverse
through keys in JSON object in java.
Get nested object associated with given key(time) - you can use
getJSONObject() method provided by Json library for this.
Get "color" field from json object - you can use optString() or
getString() methods provided by Json library for this- depending
upon whether your string is mandatory or optional.
Here is working solution in java for your problem:
public static void getColor(JSONObject payloadObject) {
try {
JSONArray keys = payloadObject.names();
for (int i = 0; i < keys.length(); i++) {
String key = keys.getString(i); // Here's your key
JSONObject value = payloadObject.getJSONObject(key); // Here's your value - nested JSON object
String color = value.getString("color");
System.out.println(color);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
Please note, it is considered that object you receive as payload is a JSON object.
Hope this helps.
Thanks.
Use Keys() method which return Iterator<String> so that it will be easy for iterating every nested JSON
for (int i = 0; i < JArray.length(); ++i) {
try {
JSONObject rec = JArray.getJSONObject(i);
Iterator<String> keys = rec.keys();
while(keys.hasNext()) {
String key1 = keys.next();
JSONObject nested = rec.getJSONObject(key1); //{"color":"grey","time_color":"black"}
//now again same procedure
Iterator<String> nestedKeys = nested.keys();
while(nestedKeys.hasNext()) {
String key2 = nestedKeys.next();
System.out.println("key"+"..."+key2+"..."+"value"+"..."+nested.getString(key2);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
android.util.Log.e("print row:", String.valueOf(rec));
}

W/System.err: org.json.JSONException: No value for notiang

I know that there are several questions posted on here with the same topic and error, but none of them indicate the same problem as mine, so I decided to post my question here, hoping that someone would help me point out the cause. Here's the code:
private void showEmployee(String json){
try {
JSONObject jsonObject = new JSONObject(json);
JSONObject c = jsonObject.getJSONObject(Config.TAG_JSON_ARRAY);
Log.e("result",json);
if(c!=null) {
idwo=c.getString("id");
String notiangs = c.getString(Config.TAG_NOTIANG);
String alamats = c.getString(Config.TAG_ALAMAT);
String gardus = c.getString(Config.TAG_GARDU);
String penyulangs = c.getString(Config.TAG_PENYULANG);
String lats = c.getString(Config.TAG_GPSLAT);
String lons = c.getString(Config.TAG_GPSLON);
String kettings = c.getString(Config.TAG_JUMLAHKETTING);
notiang.setText(notiangs);
alamat.setText(alamats);
gardu.setText(gardus);
penyulang.setText(penyulangs);
lat.setText(lats);
lon.setText(lons);
ketting.setText(kettings);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
And this is the JSON response:
E/result: {"result":{"0":"3","id":"3","1":"abc1235gvv","no_tiang":"abc1235gvv","2":"JTM","jenis_tiang":"JTM","3":"","jumlah_ketting":"","4":"Mangkurayat","alamat":"Mangkurayat","5":"Cilawu","kecamatan":"Cilawu","6":"4555","kodepos":"4555","7":"Jawa Barat","provinsi":"Jawa Barat","8":"Kabupaten Garut","kota":"Kabupaten Garut","9":"adghc","penyulang":"adghc","10":"","gardu":"","11":"2017-05-01 08:49:49","tanggal":"2017-05-01 08:49:49","12":"107.88593833333334","lat":"107.88593833333334","13":"-7.249803333333333","lon":"-7.249803333333333"}}
So apparently there is a value for notiang, but I still got this warning in my logcat:
W/System.err: org.json.JSONException: No value for notiang
The error is so clear it says you cannot convert JSONArray to JSONObject then you need to change this line
JSONObject jsonObject = new JSONObject(json);
to this
JSONArray jsonArray = new JSONArray(json);
and then in a for loop get JSONObject of the index and do whatever you want
for determining your object whether is JSONArray or JSONObject you can do this
String data = "{ ... }";
Object json = new JSONTokener(data).nextValue();
if (json instanceof JSONObject)
//you have an object
else if (json instanceof JSONArray)
//you have an array
You are expecting a json object, while you are getting an array of json objects.
Change this Line
JSONObject c = jsonObject.getJSONObject(Config.TAG_JSON_ARRAY);
To
JSONArray peoples = null;
peoples = jsonObject .getJSONArray("Your Array Name/Tag);
The problem is your result have json array and your are trying it to convert to Json Object.
try {
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject c = jsonArray.getJSONObject(i);
Log.e("result",json);
if(c!=null) {
idwo=c.getString("id");
String notiangs = c.getString(Config.TAG_NOTIANG);
String alamats = c.getString(Config.TAG_ALAMAT);
notiang.setText(notiangs);
alamat.setText(alamats);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
try{
JSONArray jArray= null;
jArray= jsonObject .getJSONArray("Key name);
}catch(Exception e){
}

Unable to set json string to TextView in onPostExecute in asyncTask

The problem that I'm facing right now is I simply want to set the string data from a json array in onPostExecute(). I skeemed through many tutorials on it, however, I am unable to set the Text that resides in the MainActivity. I've added the sample code below . I wonder if the data is wrong .
#SuppressWarnings("unchecked")
protected void onPostExecute(JSONObject jsonobject) {
try {
jsonarray = jsonobject.getJSONArray("grape");
outerjson = jsonarray;
String ids = jsonobject.optString("id");
String tpes = jsonobject.optString("type");
for (int i = 0; i < jsonarray.length(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
jsonobject = jsonarray.getJSONObject(i);
String str = "";}
// Step 3.
map1 = new HashMap<String, String>();
// this is the last step 4.
try {
JSONArray jArray = new JSONArray(str);
for (int i = 0; i < jArray.length(); i++) {
JSONObject json = null;
json = jArray.getJSONObject(i);
map1.put("id", json.getString("id"));
map1.put("type", json.getString("type"));
}
result.setText(jsonarray.toString());
///set the json in here
}catch (JSONException e) {}
} catch (JSONException e) {}
progressDialog.dismiss();
}
Not enough information, but I will try:
Make your code cleaner by using a container entity: MyData data = gson.fromJson(jsonobject, MyData.class).
Do not ignore exceptions
Make sure you are calling result.setText(string); within a main UI thread
Follow these 3 steps and, find the error, you will.

Android JSON Parsing And Conversion

Good morning.
I am trying to parse JSON data into a string but I think I'm doing something wrong: here is the section.
private void read_JSON()
{
String JSON;
JSONObject jso3 = new JSONObject(JSON);
for (int i=0; i < jso3.length(); i++)
{
try
{
String name = jso3.getString("Nombre");
String surname = jso3.getString("Apellidos");
String date = jso3.getString("Año_nacimiento");
String child_names = jso3.getString("Nombres_Hijos");
}catch (JSONException e)
{
e.printStackTrace();
}
}
jso3.toString(JSON);
}
I created the JSON within the MainActivity.java, it's not on a separate file.
Here is the code of the JSON creation:
private void create_JSON()
{
JSONObject jso = new JSONObject();
try {
jso.put("Nombre","Miguel");
jso.put("Apellidos", "Garcia");
jso.put("Año_nacimiento", 1990);
JSONArray jsa = new JSONArray();
jsa.put("Blur");
jsa.put("Clur");
jso.put("Nombres_Hijos", jsa);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
jso.toString();
I have no doubts that the JSON is correctly created, I just need help in understanding how do I parse it and convert it into a String.
I would be very grateful if you could point out to me the flaws in my programming.
Mauro.
Try this..
Your response like below
{ ==> JSONObject
"Año_nacimiento": 1990, ==> String from JSONObject
"Nombres_Hijos": [ ==> JSONArray
"Blur", ==> Directly from JSONArray
"Clur"
],
"Apellidos": "Garcia",
"Nombre": "Miguel"
}
To parse the JSON use below code:
JSONObject jso3 = new JSONObject(output);
String name = jso3.getString("Nombre");
String surname = jso3.getString("Apellidos");
int date = jso3.getInt("Año_nacimiento");
JSONArray menuObject = jso3.getJSONArray("Nombres_Hijos");
for(int i=0;i<menuObject.length;i++){
System.out.println(menuObject.getString(i));
}
Use the following options while parsing JSON to avoid common error.
JSONObject jso3 = new JSONObject(output);
String name = jso3.optString("Nombre",""); // here default value is blank ("")
String surname = jso3.optString("Apellidos",null);// here default value is null
int date = jso3.getInt("Año_nacimiento",0); // here default value is ZERO (0)
JSONArray menuObject = jso3.getJSONArray("Nombres_Hijos");
for(int i=0;i<menuObject.length;i++){
System.out.println(menuObject.getString(i));
}
Using opt option you can set default return value. Event if that tag not available in JSON data you will get default value.
This works for me better than GSON lib.
Try this.
String apellidos = jso.getString("Apellidos");
System.out.println(apellidos);
int str2 = jso.getInt("Año_nacimiento");
System.out.println(str2);
String nombre = jso.getString("Nombre");
System.out.println(nombre);
JSONArray array = jso.getJSONArray("Nombres_Hijos");
for(int i = 0; i < array.length(); i++){
System.out.println(array.get(i));
}
First at all, you seem to ignore Strings created in read_JSON, but i assume you do this to avoid pasting here too much code.
Problem is this line:
String child_names = jso3.getString("Nombres_Hijos");
Because fields Nombres_Hijos is JsonArray, not String. To read it use:
JSONArray jsa = jso3.getJSONArray("Nombres_Hijos");
Now all depands what you need to do later with this data.
Easiest case would be:
String names = jsa.toString(); //["Blur","Clur"]
private void read_JSON(String json)
{
JSONObject jObject= new JSONObject(json);
JSONArray jso3= new JSONArray(jObject.getString("Nombres_Hijos"));
for (int i=0; i < jso3.length(); i++)
{
try
{
String name = jso3.getString("Nombre");
String surname = jso3.getString("Apellidos");
String date = jso3.getString("Año_nacimiento");
String child_names = jso3.getString("Nombres_Hijos");
}catch (JSONException e)
{
e.printStackTrace();
}
}
jso3.toString(JSON);
}
try{
String JSON ;
JSONObject jso3 = new JSONObject(JSON);
JSONArray menuObject = new JSONArray(jObject.getString("array_inside_json"));
for(int i=0;i<menuObject.length;i++){
name=jObject.getString("inside"));
}
}catch(Exception e){
}
refer this link for more info

java.lang.ClassCastException: java.lang.String JSON Tokener android

The following is my code. It works fine on the emulator. But when I run it on my android device, it crashes with java.lang.ClassCastException: java.lang.String at the line marked below. I can't find the place where the casting has gone wrong. Any help would be greatly appreciated! :)
public static MatrixCursor getRespAsCursor(String query) {
String url = (String)(API_URL + "?api_key=" + API_KEY + "&" + query);
System.out.println(url);
String resp = (String)getAPIResp(url);
JSONObject reply;
MatrixCursor emptyCursor = new MatrixCursor(new String[0]);
try {
reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE
String statusCode = (String)reply.getString("statusCode");
if(!statusCode.equals("200")) {
return emptyCursor;
}
int count = Integer.parseInt(reply.getString("count"));
if(count < 1) {
return emptyCursor;
}
JSONArray data = reply.getJSONArray("data");
//Get keys in String[] format
Iterator<String> keys = data.optJSONObject(0).keys();
List<String> copy = new ArrayList<String>();
//Add "_id" as adapters need it for traversal
copy.add("_id");
//copy rest of the keys
while (keys.hasNext())
copy.add(keys.next());
String[] sKeys = new String[copy.size()];
copy.toArray(sKeys);
int len = data.length();
//Create Cursor with JSON keys as columns
MatrixCursor resultCursor = new MatrixCursor(sKeys, len);
//Add rows to Cursor
for(int i = 0; i < len; i++) {
JSONObject d = data.optJSONObject(i);
List<Object> values = new ArrayList<Object>();
for(String key: copy) {
if(key.equals("_id")) {
values.add(Integer.toString(i));
}
else {
values.add(d.opt(key));
}
}
resultCursor.addRow(values);
}
return resultCursor;
}
catch(JSONException e) {
return emptyCursor;
}
}
You've already shown the place the casting goes wrong - it's here:
reply = (JSONObject) new JSONTokener(resp).nextValue();
nextValue() is returning a String, and you're casting it to JSONObject.
I suspect the JSON isn't as you expect it to be - it's not a statusCode = "value" pair; it's just the value.
You should check the JSON that you're returning, and either change to cast to a string, or if you want to be able to handle both forms of JSON, check the result with instanceof before casting:
Object reply = new JSONTokener(resp).nextValue();
if (reply instanceof String) {
...
} else if (reply instanceof JSONObject) {
...
}
You might wanna have a look at JSONTokener javadoc
The doc says nextValue()
Get the next value. The value can be a Boolean, Double, Integer,
JSONArray, JSONObject, Long, or String, or the JSONObject.NULL object.
You are probably getting the ClassCastException as your line of code
reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE
does not return JSONObject.
You might want to check instance type of the returned object before typecasting it.
For example,
Object obj = new JSONTokener(resp).nextValue();
if(obj instanceof JSONObject){
reply = (JSONObject)obj;
} else {
//Handle otherwise,
}
reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE
If you are getting a ClassCastException is because the Object returned by nextValue() is not a JSONObject (probably a String instance)

Categories

Resources