0

In Java, I've these key/value pairs passed by post (for example):

form_id=undefined

frmb[0][cssClass]=input_text

frmb[0][required]=checked

frmb[0][values]=First Name

frmb[1][cssClass]=input_text

frmb[1][required]=checked

frmb[1][values]=Last Name

frmb[2][cssClass]=textarea

frmb[2][required]=undefined

frmb[2][values]=Bio

frmb[3][cssClass]=checkbox

frmb[3][required]=undefined

frmb[3][title]=What's on your pizza?

frmb[3][values][2][baseline]=undefined

frmb[3][values][2][value]=Extra Cheese

frmb[3][values][3][baselise]=undefined

frmb[3][values][3][value]=Pepperoni

frmb[3][values][4][baseline]=undefined

frmb[3][values][4][value]=Beef

frmb[4][cssClass]=radio

frmb[4][required]=undefined

frmb[4][title]=Do you like pizza?

frmb[4][values][2][baseline]=checked

frmb[4][values][2][value]=Yes

frmb[4][values][3][baseline]=undefined

frmb[4][values][3][value]=No

frmb[5][cssClass]=select

frmb[5][multiple]=checked

frmb[5][required]=checked

frmb[5][title]=Select a pizza type:

frmb[5][values][2][baseline]=checked

frmb[5][values][2][value]=Margherita

frmb[5][values][3][baseline]=undefined

frmb[5][values][3][value]=Napoli

frmb[5][values][4][baseline]=undefined

frmb[5][values][4][value]=Marinara

I've to create the following json:

[{"cssClass":"input_text","required":"checked","values":"First Name"},{"cssClass":"input_text","required":"checked","values":"Last Name"},{"cssClass":"textarea","required":"undefined","values":"Bio"},{"cssClass":"checkbox","required":"undefined","title":"What's on your pizza?","values":{"2":{"value":"Extra Cheese","baseline":"undefined"},"3":{"value":"Pepperoni","baseline":"undefined"},"4":{"value":"Beef","baseline":"undefined"}}},{"cssClass":"radio","required":"undefined","title":"Do you like pizza?","values":{"2":{"value":"Yes","baseline":"checked"},"3":{"value":"No","baseline":"undefined"}}},{"cssClass":"select","required":"checked","multiple":"checked","title":"Select a pizza type:","values":{"2":{"value":"Margherita","baseline":"checked"},"3":{"value":"Napoli","baseline":"undefined"},"4":{"value":"Marinara","baseline":"undefined"}}}]

How could I do?

I don't succeed in parsing the keys, grouping the elements which do part of the same JSONObject.

Sefran2
  • 3,578
  • 13
  • 71
  • 106
  • That's nice. It looks like a case for recursion. What have you tried? –  Jun 09 '12 at 20:32
  • @pst: Actually I was thinking something recursive, but I have not tried. I think I've to parse the keys, but what "structure" I have to create to use org.json to build the json? – Sefran2 Jun 09 '12 at 20:46
  • Just walk it into the appropriate "JSONObjects" while recusing; the org.json version is more than sufficient for this. It looks like "is numeric key" *or* "values" they create a nested JSONObject (recurse) else, just map to property in current level. –  Jun 09 '12 at 20:55

3 Answers3

1

You can use the Gson library for this. It does not support serializaton of nested maps (I assume your output represents a nested map). You can write a custom serializer/deserializer or create your own serialization method following the instructions in this thread

Community
  • 1
  • 1
kostja
  • 60,521
  • 48
  • 179
  • 224
1

You can do something like this:

JSONArray jsonItems = new JSONArray();

for (int i = 0; i < frmb.size(); i++) {  

JSONObject json = new JSONObject();  
json.put("cssClass", frmb[i][cssClass]);  
json.put("required",frmb[i][required]);  
//put json object to json array  
jsonItems.put(json);   
}

Check here for more details

sayan
  • 242
  • 2
  • 2
  • Yes, so how to expand this to work over the nested structure? –  Jun 09 '12 at 21:26
  • As I haven't a JSONObject for each element passed by post, and as the keys are strings, I think I have to parse the keys in some way and build the JSONArray. – Sefran2 Jun 10 '12 at 19:20
0

I resolved by parsing the keys and by building the JSONObjects with the use of two temporary hashtables.

Sefran2
  • 3,578
  • 13
  • 71
  • 106