creating json array from arraylist android - php

I've been toying around with this for a little while and I'm looking for some help. I have an ArrayList that I turn into a JSONArray and then place inside JSONObject. The problem is my formatting. Allow me to show you.
I get the values for my ArrayList and add them like so (small code snippet)
if (v instanceof EditText) {
String answer = ((EditText) v).getText().toString();
if (answer.equals("")) {
error.setText(v.getTag().toString()
+ " Needs an answer");
((EditText) v).setHint("Fill me out!");
((EditText) v).setHintTextColor(getResources()
.getColor(R.color.red_bg));
} else {
error.setText("");
}
String question = v.getTag().toString();
String combo = question + ": " + answer;
myList.add(combo);
Log.v("INFO", "Storing: " + combo);
}
This works, but adding the ":" is the start of my problems. The log prints out
06-19 12:13:33.630: V/INFO(3272): Storing: Height: 6`4
Now when I create my JSON to be sent over I use the following
if (error.getText().toString().equals("")) {
JSONObject json = new JSONObject();
JSONArray jArray = new JSONArray(myList);
try {
json.putOpt("array", jArray);
} catch (JSONException e) {
e.printStackTrace();
}
Again, this works. Now the problem clearly illustrated, it prints out JSON like this
{
"array":
[
"Store #: 00608",
"Phone #: null",
"Address: 3014 N. SCOTTSDALE RD.",
"City: SCOTTSDALE",
"Zip: 85251",
"State: AZ",
"Height: 6`4",
"Weight: 230",
"Ethnicity: White",
"Age: 23",
"Eye Color: Blue",
"Favorite Food: Thai",
"Comments: awesome"
]
}
If you're familiar with JSON you know I've goofed it here. I was merely trying to keep the question and answer together. However by adding the ":" to the middle it looks like I'm trying to use question as the key and answer as the value (kind of). Anyways in the end this looks like legitimate JSON, and it is, but it doesn't work the way I need it to.
My question is, should I just make "question" the key, and "answer" the value?
If so how would I go about creating my JSONArray so that my JSON looks like this
{
"array":
[
"Store #" : "00608",
"Phone #" : "null",
"Address" : "3014 N. SCOTTSDALE RD.",
"City" : "SCOTTSDALE",
"Zip" : "85251",
"State" : "AZ",
"Height" : "6`4",
"Weight" : "230",
....
]
}
So that a simple
var_dump(json_decode($json));
var_dump(json_decode($json, true));
in PHP will provide me with the data I need server side.
or alternatively would it just be simpler to keep this format and split the strings as I parse them server side? Whichever answer you choose please supply a few lines of code with to illustrate your answer. As you can tell I'm a visual person.
Thanks for the help, I hope this helps other people in the future as well!

You can solve this a bunch of ways. If you want to keep the formatting the way it is you just need to process your strings first. When you get values from your ArrayList just split the combo into parts
int splitPoint = combo.indexOf(":")
String key = combo.substring(0, splitPoint);
String value = combo.substring(splitPoint + 1);
Once you split the key and value out just create a new JSONObject and add the key and value as a string
JSONObject jObject = new JSONObject();
jObject.put(key, value);
This will add the JSONString to its own JSONObject. Then you can add this object to the JSONArray that you want to create
JSONArray jArray = new JSONArray();
jArray.puJSONObject(jObject);
I broke this down in to parts but if you just decalre your JSONArray ouside a for loop or some other iterator and loop through your ArrayList, processing each combo string and adding the resulting object to a JSONArray you can acheive the desired result

I am not sure that you can do the following in JSON
[ "key":"value, ...."].
You may be able to do it with Key Value object pairs, as in
[ {"key":"value"},...]
If you do it with objects, you will have to create a new object for each pair, and it might become pretty complicated since the key in JSON corresponds with the name of an instance variable.
My suggestion is to leave it the way you have it now and split the strings. I am not familiar with PHP, but it should be as simple as looping through the JSON array and calling something like split(':') on the strings.

You can make a JSONObject with dynamic keys like so:
{
"Store #" : "00608",
"Phone #" : "null",
"Address" : "3014 N. SCOTTSDALE RD.",
"City" : "SCOTTSDALE",
"Zip" : "85251",
"State" : "AZ",
"Height" : "6`4",
"Weight" : "230",
....
}
The question what is simpler, can only be answered by you yourself, as obviously you implement the App and the Server part. So whatever works best for you is the right way.
Performance-wise, joining strings on one side and splitting them on the other side is not the best, but it also depends on how many entries there are in your array.

Related

jsonObject.getString("String in UTF8" ) giving blank

I am fetching a string from my MySql DB on and online server using webservice in JSON format.
I am able to see that Android Studio is fetching it correctly as I see it in debugging mode.
But when I go ahead and add it to a List list, I get nothing.
Here's some more info:
What I am getting:
{"products":[{"veg_name_eng":"Corn","veg_name_hindi":"मक्का"}],"success":1}
My concern is with: "veg_name_hindi":"मक्का"
When I go ahead and try to put it in a dataitem list, I get nothing:
public static List<DataItem> dataItemList;
dataItemList.add(jsonObject.getString(veg_name_eng),jsonObject.getString(veg_name_hindi))
veg_name_eng and veg_name_hindi are the column names at my table.
After the above code I get dataItemList = null, So nothing is adding to it.
In my server side MySql DB, I am using UTF-8 encoding.
I am using android studio.
UPDATE 1:
I am parsing the JSON as :
JSONObject jsonObject = new JSONObject(myJSONString);
veg_list = jsonObject.getJSONArray("products");
try {
while (TRACK < veg_list.length()) {
JSONObject jsonObject = veg_list.getJSONObject(TRACK);
addItem(new DataItem(jsonObject.getString(veg_name_eng), jsonObject.getString(veg_name_hindi)));
TRACK = TRACK + 1;
}
} catch (JSONException e) {
e.printStackTrace();
}
// and the addItem function is as follows:
private static void addItem(DataItem item) {
dataItemList.add(item); //While Debugging, I can see that value of item is correct. (i.e., item: DataItem{veg_name_eng='Cork', veg_name_hindi='मक्का'} )
dataItemMap.put(item.getVeg_id(), item);
}
Firstly, Make a model of the your JSON String using
http://json2java.azurewebsites.net/
and then map your JSON String to your Model using Gson. It's much easy to use.
Another way to get your required String for this particular result is parse json string yourself.
For Example :
String vegNameEng,vegNameHindi;
vegNameEng = vegNameHindi = "";
try{
JSONObject obj = new JSONObject(yourJsonString);
JSONArray arr = obj.getJSONArray("products");
vegNameEng = arr.getJSONObject(0).getString("veg_name_eng");
vegNameHindi = arr.getJSONObject(0).getString("veg_name_hindi");
}catch(JSONException ex){
}
Now vegNameEng and vegNameHindi have the required data.
I figured out, It was a silly mistake, the variable I was using to put data into the database was overwritten by some other variable with the same name. Closing the thread for now. Thanks #Umer-Farooq.

Android JSON string to JSONArray

In my project I get data from php server, this data in JSON syntax.
Then my application get this data from the server with simple http request and save that into a string. Now the problem is in the process of converting this string into JSON object and JSONArray.
Server return data -
{"lat":"35.241","lng":"76.845","name":"AAA"}{"lat":"38.247"lng":"76.852","name":"GGG"}
Get the string from the server and convert to JSON -
JSONObject jsonObject = null;
String url = "http://placePPP.com/hr.php?request=1";
String response = MyHttpRequest(url);
try {
jsonObject = new JSONObject(response);
} catch (JSONException e) {
e.printStackTrace();
}
The response data equal to the Server return data (there is no problem), But after the conversion to the JSON I get only the first part of the string I try to convert -
{"lat":"35.241","lng":"76.845","name":"AAA"}
I would love if someone can help me to understand why I get only the first part and how can I convert this string into a JSON object and to JSONArray in the best way thanks.
It is a malformed JSON, that's why you only have the first part.
Look at this comment for more details.
It's not valid JSON, you have two json objects next to each other.
talk with developer to send data in object or then your data as
jsonMainobject {
{"lat":"35.241","lng":"76.845","name":"AAA"}{"lat":"38.247"lng":"76.852","name":"GGG"}
}
or you can done as
jsonarray[
{"lat":"35.241","lng":"76.845","name":"AAA"}{"lat":"38.247"lng":"76.852","name":"GGG"}
]
Change string from
{"lat":"35.241","lng":"76.845","name":"AAA"}{"lat":"38.247"lng":"76.852","name":"GGG"}
to
[{
"lat": "35.241",
"lng": "76.845",
"name": "AAA"
},
{
"lat": "38.247",
"lng": "76.852",
"name": "GGG"
}]
For check valid json can use this link : http://www.jsoneditoronline.org/
Your server is not producing valid JSON response. Check here https://jsonformatter.curiousconcept.com/
Valid response would look like this:
[
{"lat":"35.241", "lng":"76.845", "name":"AAA"},
{"lat":"38.247", "lng":"76.852", "name":"GGG"}
]
Also parse it with JsonArray to get an array of two JsonObjects inside.

Using JSON in PHP to send data to Android

I'm not sure that the JSON codes i have used in my PHP is right to send the data to my Android App. My Android app works fine without any errors. I'm using Async Task to retrieve information from the server using JSON.
This is the code i have used in my Android app to get information from server :
JSONArray arr = new JSONArray(result);
JSONObject jObj = arr.getJSONObject(0);
myoutput = jObj.getString("stringpval");
I havn't displayed the entire code, but i'm sure that all the other codes work fine.
And below is my PHP script used to create a JSON array in PHP:
$a = array(
array('stringpval' => "My Value"));
print $json = json_encode($a);
So i have finished encoding json. I want my TextView in android to display "My Value"! Now when i run my android app and try to get the information from the server, my TextView goes blank. It is Null! What's the problem? Any Solution? Are the above codes correctly used?
The reason is that json_encode($a); is actually returning a JSONObject and not just a JSONArray as you're thinking.
What you're currently printing will look like this:
{
{
'stringpval' = "My Value"
}
}
I'm not sure why you're using a double-array for passing back a single value like that, so for now I would change your PHP file to:
$a = array('stringpval' => "My Value");
print $json = json_encode($a);
Which will return:
{
'stringpval' = "My Value"
}
Which you could then access in Java by:
JSONObject jObj = new JSONObject(result);
myoutput = jObj.getString("stringpval");
json usually is in two forms, either objects, or arrays, this is very important because you have to know which values are you retrieving from the server(json array or json object?) and hence parse them in the correct manner in the client side.
JsonArray are usually like this
{
"jsonarray_example": [
{
"id": "1",
"name": "android",
"description": "android 4.4.3 kitkat",
"updated_at": "0000-00-00 00:00:00"
} ,
{
"id": "2",
"name": "android",
"description": "android 4.1 jellybin",
"updated_at": "0000-00-00 00:00:00"
}
]
}
The opening and closing [] marks the array while the {} brackets marks the objects of the array called jsonarray_example but the brackets need not be like that now if your php page outputs something like that then you can retrieve the array else you have to retrieve the objects JsonObject in android
so from your problem above you are trying to retrieve jsonObjects while your response is array you should use something like
JsonArray result = new JsonArray() ;
JsonObject obj = //access the server files
result = obj.getJsonArray("stringpval") ;
// proceed extracting individual content from the response
for more check this LINK and this ONE can be really helpful

How do I include one JSON in another JSON?

My first JSON is:
{
"categoryId":"Painting",
"subCategoryId":"Residential",
"alternatives": [1,2,3,4,5],
"criterias":["price","quantity","yom","company"],
"answers":[["1000","12343","4543","","4645646"],["12","23","34","","45"],["2014","","2000","1990","2005"],["xyz","","Abc","jkl","mno"]]
}
This will come from a java URL, here I am using PHP, in PHP I am calling a java URL.
My Second JSON is:
{"criterias":"Location"}
I am generating this using JQuery.
How can I include the second JSON into the first JSON criterias?
The simplest way to include one file in another is to use cpp (C preprocessor).
For example, if I have test.json as
{"name":"NAME",
#include "another.json"
}
and another.json as
"inner":"value"
you should be able to obtain
$ cpp -P test.json
{"name":"NAME",
"inner":"value"
}
Of course, you will need to make sure that resulting syntax is correct by properly formatting both pieces.
I believe the original question is how to merge these 2 JSON objects within javascript. Assuming that, the answer is simple.
var firstJson = {
"categoryId":"Painting",
"subCategoryId":"Residential",
"alternatives": [1,2,3,4,5],
"criterias":["price","quantity","yom","company"],
"answerss":[["1000","12343","4543","","4645646"],["12","23","34","","45"],["2014","","2000","1990","2005"],["xyz","","Abc","jkl","mno"]]
};
var secondJson = {"criterias":"Location"};
firstJson.criterias = $.extend({},firstJson.criterias,secondJson.criterias);
You need to convert your first JSON string to object and add a new property to it.
If it is Java, you can use Google's Gson library
Gson gson = new Gson();
JsonObject jsonObj = gson.fromJson (jsonStr, JsonElement.class).getAsJsonObject();
jsonObj.add("criterias", "Location");
If it is JavaScript,
var jObj = JSON.parse(jsonString);
jObj.criterias = "Location"; //jObj.NewItem = "NewValue";
Here is the example of how you write nested JSON
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
For More examples visit following links:
http://www.jsonexample.com/
http://json.org/example
create nested JSON object in php?

Parse JSON with unknown data using Android

I am pulling all the values of an assessment's questions and answers out of two tables that have auto generated table names and column names. They are made server side with .csv files. It's pretty bad but I found a way using SELECT * statements in PHP. Anyways in my PHP file I have two arrays, questions and answers. I combine them and make a JSON Array like this
try {
$success = 1;
if (!empty($questions) && !empty($answers)) {
$combo = array_combine($questions, $answers);
// success
echo $success;
// echoing JSON response
echo json_encode($combo);
} else {
$response["success"] = 0;
echo json_encode($response);
}
} catch (PDOException $e) {
die($e->getMessage());
}
Now the JSON comes out as desired like this
{
"1": "4",
"Store #": " 0560",
"How many microwave circuits did you run?": " 3",
"How many new ovens did you deliver to the store?": " 1",
"How many new racks did you deliver to the store?": " 5",
...
...
}
The left side of the : contains the question and the right contains the answer. Just like I wanted.
The problem is my app will never know how much data this JSON Array will have or what will be inside it. So using my normal method of parsing this info will not work. I would under normal circumstances use something like this
class Load extends AsyncTask<String, Void, String> {
protected void onPreExecute() {
//progress bar etc
....
}
protected String doInBackground(String... args) {
try {
// Checking for SUCCESS TAG
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
Log.v("RESPONSE", "Success!");
// products found: getting Array of Questions
questions = json.getJSONArray(TAG_QUESTIONS);
// looping through All Questions
for (int i = 0; i < questions.length(); i++) {
JSONObject c = questions.getJSONObject(i);
// Storing each JSON item in variable
String name = c.getString(TAG_NAME);
String field = c.getString(TAG_FIELD);
String value = c.getString(TAG_VALUE);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_NAME, name);
map.put(TAG_FIELD, field);
map.put(TAG_VALUE, value);
infoList.add(map);
}
....
This however requires you to set some sort of identifier for your tags in PHP and/or know whats coming across so you can tell the code how to parse the Strings etc.
So can you parse JSON with unknown data? If so, how?
Thanks in advance
EDIT
I'm working on what I think is a solution but I need some help. Here is the code I'm using inside doInBackground()
try {
// Checking for SUCCESS TAG
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
info = json.getJSONArray(TAG_INFO);
for (int i = 0; i < info.length(); i++) {
if (info != null) {
for (int j = 0; j < info.length(); j++) {
clientList.add(info.get(j).toString());
}
}
}
for (String s : clientList) {
Log.v("CHECKING S", s);
s.split(":");
Log.v("CHECKING S SPLIT", s);
values.add(s);
Log.v("CHECKING VALUES 0", values.get(0));
mQuestions.add(values.get(0));
Log.v("CHECKING VALUES 1", values.get(1));
mAnswers.add(values.get(1));
}
}
But the response stays in JSON and does not split it at all.
The log.v Looks like this
06-27 23:26:03.419: V/CHECKING S SPLIT(32233): {"Were any of the steamers gas?":" yes","Voltage readings on Turbo Chef 4":" 34","Voltage readings on Turbo Chef 3":" 43","Voltage readings on Turbo Chef 2":" 54","Did you label all the outlets?":" yes","Voltage readings on Turbo Chef 1":" 64","How many new ovens did you deliver to the store?":" 1","If yes, did you cap the water lines?":" yes","Phone #":" (740) 389-1174","Has all new equipment been installed & have you confirmed it is all working properly?":" yes","How many new racks did you deliver to the store?":" 5","Are all oven circuits tied into electrical shut down for hood?":" yes","How many Back steamers did you remove?":" none","Date":" 6-24-13","Zip":" 43302","How many oven circuits did you run?":" 2","How many microwave circuits did you run?":" 3","If yes, did you cap the gas lines?":" yes","Did you remove the existing FRONT steamers?":" yes","Did you remove the existing BACK steamers?":" no","Voltage readings on microwave circuit 1":" 57","City":" Marion","Voltage readings on microwave circuit 3":" 92","If yes, how? Shunt Tripp or Contactor":" shunt tripp","Voltage readings on microwave circuit 2":" 87","How many front steamers did you remove?":" 2","1":"4","State":" OH","Store #":" 0560","How many existing steamers did you remove for disposal off-site?":" none","Address":" 1318 Mount Vernon Avenue","Tech Name":" Jon Doe"}
They all look like this, none of them are split and they are still in JSON form. Any ideas?
I think you could change the structure of json which you returned.
Maybe like the blow
{
"1": "4",
"Store #": " 0560",
"How many microwave circuits did you run?": " 3",
"How many new ovens did you deliver to the store?": " 1",
"How many new racks did you deliver to the store?": " 5",
...
...
}
to
{
questions: [
{
question: "1",
answer: "4"
},
{
question: "Store",
answer: "0560"
},
{
question: "How many microwave circuits did you run",
answer: "3"
},
{
question: "How many new ovens did you deliver to the store?",
answer: "1"
},
{
question: "How many new racks did you deliver to the store?",
answer: "5"
}
]
}
and parse json as jsonarray
i don't know about php, but i can achieve something like that in perl using key value
you can read here for more info about key value in php, hope it can help you http://php.net/manual/en/language.types.array.php
i think the problem is you only parse JSON array once instead twice
you need to parse the JSON array for the second time to parse question - answer list
try {
// Checking for SUCCESS TAG
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
info = json.getJSONArray(TAG_INFO);
for (int i = 0; i < info.length(); i++) {
if (info != null) {
//parse JSON Array for the second time to parse question - answer
JSONArray jarray = new JSONArray(info.getString(i));
for (int j = 0; j < jarray.length(); j++) {
clientList.add(jarray.getString(j));
}
}
}

Categories