Rick45 Posted July 22, 2013 at 07:16 PM Report #519586 Posted July 22, 2013 at 07:16 PM Boas pessoal, surgiu-me nova duvida estou a criar um objecto json na minha app assim: JSONObject jsonlocation = new JSONObject(); JSONObject json = new JSONObject(); try { jsonlocation.put("lat", latvalue); jsonlocation.put("longi", longvalue); jsonlocation.put("nome", nome); jsonlocation.put("morada", morada); jsonlocation.put("contacto", contacto); jsonlocation.put("descricao", descricao); json.put("location",jsonlocation); e envio-o assim: eddit: penso que o meu problema esta na parte do envio no android, pois antes de o enviar enviei-o para o ecrã e nao tinha as \ HttpClient client = new DefaultHttpClient(); HttpResponse response; try{ HttpPost post = new HttpPost("meu site"); List<NameValuePair> nVP = new ArrayList<NameValuePair>(2); nVP.add(new BasicNameValuePair("json", Jobj.toString())); post.setEntity(new UrlEncodedFormEntity(nVP)); response = client.execute(post); String temp = EntityUtils.toString(response.getEntity()); Log.i("tag", temp); do lado do servidor recebo-o assim: $jsonString = $_POST['json']; echo $jsonString ; $jobj = json_encode($jsonString); $lat = $jobj['lat']; $longi = $jobj['longi']; $nome = $jobj['nome']; $morada = $jobj['morada']; $contacto = $jobj['contacto']; $descricao = $jobj['descricao']; O problema é que a string que recebo vinda do android no $jsonString = $_POST['json']; é assim: { \"contacto\": \"9123456\", \"nome\": \"campodonome\", \"morada\": \"campodamorada\", \"descricao\": \"campodadescricao\", \"lat\": 37.422005, \"longi\": -122.084095 } quando deveria ser { "contacto": "9123456", "nome": "campodonome", "morada": "campodamorada", "descricao": "campodadescricao", "lat": 37.422005, "longi": -122.084095 } Como é que posso remover as \ ou gerar isto direito?
Knitter Posted July 22, 2013 at 07:56 PM Report #519591 Posted July 22, 2013 at 07:56 PM Em vez de usares json_encode do lado do servidor, se estás a receber dados já no formato JSON, o que deves usar é o json_decode. 1 Report
KTachyon Posted July 22, 2013 at 08:42 PM Report #519599 Posted July 22, 2013 at 08:42 PM No PHP tens que fazer json_decode e não json_encode. O objectivo seria enviares o corpo (body) do pedido (request) em JSON e não enviares o JSON como form-urlencoded, que é o que o PHP está à espera. Podes enviar o JSON como corpo do pedido e ler no PHP da variável $HTTP_RAW_POST_DATA. HttpPost post = new HttpPost("meu site"); post.setEntity(new StringEntity(jsonParams.toString(), "UTF8")); $jobj = json_decode($HTTP_RAW_POST_DATA); “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
Rick45 Posted July 29, 2013 at 03:56 PM Author Report #520326 Posted July 29, 2013 at 03:56 PM KTachyon muito obrigado, resolveu-me o problema. mas no campo $jobj = json_decode($HTTP_RAW_POST_DATA); alterei para $jobj = json_decode($HTTP_RAW_POST_DATA, true); se não não conseguia aceder aos valores da maneira que estava a tentar a cima, fiz bem ou existe maneira mais eficiente? só mais uma coisa, onde eu tenho o código java para gerar o json eu coloco a parte de localização dentro do json geral json.put("location",jsonlocation);, mas como é que faço para aceder no php, porque se enviar para o servidor o jsonlocation acedo facilmente usando $jobj['nome']; mas se enviar o json principal com o mesmo comando não acedo ao valor do campo eu no meu emulador tenho android 2.2 e no meu tlm 4.2.2, quando corro a app na versao 4.2.2 ela crasha, tanto em emulador como no meu tlm, o que poderá ser??
KTachyon Posted July 29, 2013 at 11:07 PM Report #520364 Posted July 29, 2013 at 11:07 PM KTachyon muito obrigado, resolveu-me o problema. mas no campo $jobj = json_decode($HTTP_RAW_POST_DATA); alterei para $jobj = json_decode($HTTP_RAW_POST_DATA, true); se não não conseguia aceder aos valores da maneira que estava a tentar a cima, fiz bem ou existe maneira mais eficiente? Se puseres o true o resultado fica em arrays. Se não fica em objectos e tens que usar $jobj->propriedade para acederes aos valores. só mais uma coisa, onde eu tenho o código java para gerar o json eu coloco a parte de localização dentro do json geral json.put("location",jsonlocation);, mas como é que faço para aceder no php, porque se enviar para o servidor o jsonlocation acedo facilmente usando $jobj['nome']; mas se enviar o json principal com o mesmo comando não acedo ao valor do campo Faz var_dump($jobj) no PHP. eu no meu emulador tenho android 2.2 e no meu tlm 4.2.2, quando corro a app na versao 4.2.2 ela crasha, tanto em emulador como no meu tlm, o que poderá ser?? Corre em modo debug no emulador na versão 4.2.2 e mostra o erro que te dá. “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
Rick45 Posted July 30, 2013 at 11:00 AM Author Report #520403 Posted July 30, 2013 at 11:00 AM os erros que tenho são os seguintes: 07-30 10:52:19.415: E/AndroidRuntime(778): FATAL EXCEPTION: main 07-30 10:52:19.415: E/AndroidRuntime(778): android.os.NetworkOnMainThreadException 07-30 10:52:19.415: E/AndroidRuntime(778): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 07-30 10:52:19.415: E/AndroidRuntime(778): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 07-30 10:52:19.415: E/AndroidRuntime(778): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 07-30 10:52:19.415: E/AndroidRuntime(778): at java.net.InetAddress.getAllByName(InetAddress.java:214) 07-30 10:52:19.415: E/AndroidRuntime(778): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 07-30 10:52:19.415: E/AndroidRuntime(778): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 07-30 10:52:19.415: E/AndroidRuntime(778): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 07-30 10:52:19.415: E/AndroidRuntime(778): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 07-30 10:52:19.415: E/AndroidRuntime(778): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 07-30 10:52:19.415: E/AndroidRuntime(778): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 07-30 10:52:19.415: E/AndroidRuntime(778): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 07-30 10:52:19.415: E/AndroidRuntime(778): at com.example.easylocalizer.MainActivity.sendviajson2(MainActivity.java:477) 07-30 10:52:19.415: E/AndroidRuntime(778): at com.example.easylocalizer.MainActivity.access$13(MainActivity.java:451) 07-30 10:52:19.415: E/AndroidRuntime(778): at com.example.easylocalizer.MainActivity$2.onclick(MainActivity.java:259) 07-30 10:52:19.415: E/AndroidRuntime(778): at android.view.View.performClick(View.java:4204) 07-30 10:52:19.415: E/AndroidRuntime(778): at android.view.View$PerformClick.run(View.java:17355) 07-30 10:52:19.415: E/AndroidRuntime(778): at android.os.Handler.handleCallback(Handler.java:725) 07-30 10:52:19.415: E/AndroidRuntime(778): at android.os.Handler.dispatchMessage(Handler.java:92) 07-30 10:52:19.415: E/AndroidRuntime(778): at android.os.Looper.loop(Looper.java:137) 07-30 10:52:19.415: E/AndroidRuntime(778): at android.app.ActivityThread.main(ActivityThread.java:5041) 07-30 10:52:19.415: E/AndroidRuntime(778): at java.lang.reflect.Method.invokeNative(Native Method) 07-30 10:52:19.415: E/AndroidRuntime(778): at java.lang.reflect.Method.invoke(Method.java:511) 07-30 10:52:19.415: E/AndroidRuntime(778): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 07-30 10:52:19.415: E/AndroidRuntime(778): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 07-30 10:52:19.415: E/AndroidRuntime(778): at dalvik.system.NativeStart.main(Native Method)
KTachyon Posted July 30, 2013 at 07:49 PM Report #520426 Posted July 30, 2013 at 07:49 PM Nas versões 4+ do Android não podes efectuar um pedido à rede síncrono com o programa. Tens que implementar o pedido assíncronamente com uma AsyncTask: http://developer.android.com/reference/android/os/AsyncTask.html “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
Rick45 Posted July 31, 2013 at 05:20 PM Author Report #520527 Posted July 31, 2013 at 05:20 PM Nas versões 4+ do Android não podes efectuar um pedido à rede síncrono com o programa. Tens que implementar o pedido assíncronamente com uma AsyncTask: http://developer.android.com/reference/android/os/AsyncTask.html obrigado, vou tratar de alterar isso public void doTimerTask() { mTimerTask = new TimerTask() { public void run() { handler.post(new Runnable() { public void run() { try { coordsObj.put( "lat", latvalue ); //coordsObj é um jsonarray coordsObj.put( "long", longvalue ); coords.put( coordsObj ); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } }; já agora, eu tenho este timer para guardar coordnadas no json de x em x secs, mas o json coloca sempre a coordnada mais recente em todos os campos anteriores em vez de deixar as mais antigas
KTachyon Posted July 31, 2013 at 07:36 PM Report #520537 Posted July 31, 2013 at 07:36 PM (edited) Não podes ter a mesma chave para múltiplos valores num objecto JSON. Para isso tens que usar um array JSON. O ideal é manteres as coordenadas encapsuladas e não teres dois arrays (um para lat e um para long): { coordinates: [ {lat : 34.894432, long : 98.2109746}, {lat : 34.894431, long : 98.2109747}, {lat : 34.894432, long : 98.2109747} ] } Edited July 31, 2013 at 07:37 PM by KTachyon “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
Rick45 Posted August 1, 2013 at 10:59 AM Author Report #520593 Posted August 1, 2013 at 10:59 AM (edited) peço desculpa, o meu comentario no codigo está mal colocado //coordsObj é um objectojson e o coords é que é um arrayjson já resolvi o problema, o json estava a ser criado correctamente, o problema e que estava a usar sempre o mesmo objecto para coordenadas diferentes, bastou-me criar o objecto dentro do timer e ficou certinho public void doTimerTask() { mTimerTask = new TimerTask() { public void run() { handler.post(new Runnable() { public void run() { try { JSONObject coordsObj = new JSONObject(); coordsObj.put( "lat", latvalue ); //coordsObj é um jsonobj coordsObj.put( "long", longvalue ); coords.put( coordsObj ); // jsonarray } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } }; obrigado por toda a ajuda disponibilizada até agora Edited August 1, 2013 at 11:22 AM by Rick45
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now