Acceder

Ver la Versión Completa : deserializar json !!! ayudaaa


gohan0189
03/02/12, 18:21:35
Tengo un web service que me manda una cadena json que es esta:

[{"StringProperty":"0","IntProperty":0,"DoubleProperty":0},{"StringProperty":"1","IntProperty":8,"DoubleProperty":53.98},{"StringProperty":"2","IntProperty":16,"DoubleProperty":107.96}]

y necesito deserializarlo en mi app pero no se como , me he guiado con algunos ejemplos de internet y he llegado a esto:

public void autor() { SoapObject solicitud = new SoapObject(namespace, Metodo_getbookautor); SoapSerializationEnvelope envoltorio = new SoapSerializationEnvelope(SoapEnvelope.VER11); envoltorio.dotNet = true; envoltorio.setOutputSoapObject(solicitud); HttpTransportSE transporte = new HttpTransportSE(url); try { transporte.call(accionSoap_autor, envoltorio); /////////////// Object result = (Object)envoltorio.getResponse(); JSONString=result.toString(); try{ jObject= new JSONObject(JSONString); jArray=jObject.getJSONArray("WebService"); for (int i=0;i<jArray.length();i++) { JSONObject json_data= jArray.getJSONObject(i); resultString= json_data.getString("StringProperty")+ " " +json_data.getString("IntProperty")+ " " +json_data.getString("DoubleProperty"); } } catch (Exception e){ e.printStackTrace(); }


pero cuando llega a jObject= new JSONObject(JSONString);
con debug jObject me da null y ya no hace lo demas, pero la verdad no se si eso este bien puesto que no se como es eso de la serializacion y deserializacion

kriogeN
03/02/12, 20:43:32
¿Si imprimes JSONString te sale lo que pone arriba?

En caso de ser así, prueba a recibir jObject como un JSONArray, debería salirte distinto de NULL.

Si JSONString te sale vacío el problema lo tienes en la comunicación con la web.

gohan0189
03/02/12, 20:56:02
si imprimo el JSONString si me sale lo de arriba, y ya cambie en lugar de object lo puse como array y ya me toma el valor gracias, pero ahora como le pongo para que vaya tomando los valores asi como lo tengo??

pero que hago con la line4a de

jArray=jObject.getJSONArray("");
bueno es que se supone que en las "" va el nombre del arreglo no?? pero el mio no tiene nombre , solo empieza con el [

kriogeN
03/02/12, 21:00:21
Prueba esto:

JSONArray jsonArray = new JSONArray(JSONString);
jsonArray.getJSONObject(0).getString("StringProperty")

El 0 lo puedes cambiar por el búcle de la longitud de jsonArray para que te coja todos los elementos que son StringProperty, pero por lo pronto empieza con eso.

gohan0189
03/02/12, 21:08:35
ok muchas gracias , ya lo puse asi y ya salio pero solo sale el 0, no deberia de salir "StringProperty: 0", y despues lo cambie por el bucle pero solo me sale el ultimo resultado

kriogeN
03/02/12, 21:14:16
No, te sale el valor de la propiedad que has puesto en el parametro, en este caso StringProperty

Si quieres coger el IntProperty sería con:

jsonArray.getJSONObject(0).getInt("IntProperty")

Y DoubleProperty con:

jsonArray.getJSONObject(0).getDouble("DoubleProperty")

Te saldrá solo el último porque reutilizas la variable, imprime el contenido en cada paso del for y verás como te imprime los 3 StringProperty.

gohan0189
03/02/12, 21:27:51
mmm solo me saca el ultimo StringProperty pero entoncs ahorita checo eso y de verdad muchs gracias

gohan0189
03/02/12, 21:33:56
oie y no tendras algun correo o pagina donde pueda consultarte en alguna otra ocacion por si tengo alguna otr dudilla, o entras seguido x aqui??

gohan0189
03/02/12, 21:55:44
bueno y ya que estamos en lo de json , sabes como seria para serializar y mandar los datos a mi web service??

kriogeN
03/02/12, 22:09:28
Entro seguido, si tienes dudas te las podré resolver por aquí, siempre y cuando sepa hacerlo.

Serializar con JSON es un dolor de huevos tremendo, por eso mismo al final me lo dejé y pasé a XML, lo veo mucho más claro. Por eso ya he pasado por todo esto con JSON y lo tengo más o menos fresco.

Para serializar tienes que crear un JSONObject, y sobre ese JSONObject introduces elementos con put. Por ejemplo:

JSONObject jObject = new JSONObject();
jObject.put("StringProperty","Hola");

Si lo que quieres es generar un JSONArray tendrías algo así:

JSONArray jArray = new JSONArray();
JSONObject jObject = new JSONObject();
jObject.put("StringProperty","Hola");
jArray.put(jObject);

Todo menos la definición de jArray podrías meterlo en un bucle y así crearías todas las posiciones del JSONArray.

gohan0189
03/02/12, 22:13:16
ok muchas gracias de nuevo, cuando me toque hacer eso de serializacion q no tardara mucho t aviso como me fue, ahorit sigo tratando de que me imprima los 3 resultados jejejejeje pero gracias

gohan0189
04/02/12, 00:17:53
oie una duda muuy aparte de esto , sabes que es lo q tengo que hacer para poder poner el boton de registration de facebook en mi app???

kriogeN
04/02/12, 01:03:57
Temas de Twitter y Facebook los tengo pendientes ahora yo también para una aplicación que estoy desarrollando, aunque ahora ando liado en otras partes de la aplicación (además de su homóloga en IOS) así que no he tenido aún tiempo de verlo.

gohan0189
04/02/12, 01:41:25
no te preocupes gracias de todas formas, hare un poco de googleo jejejeje y ya despues si necesitas algo espero poder explicarlo jejeje gracias por todo

gohan0189
09/02/12, 20:02:01
hola de nuevo oie una preguntota en lugar de poner

text1.append(jArray.getJSONObject(i).getString("StringProperty")+" , "+
jArray.getJSONObject(i).getInt("IntProperty")+" , "+
jArray.getJSONObject(i).getDouble("DoubleProperty")+"\n");

no hay una forma para ponerle yo el tipo de objeto a reconstruir y que vaya llenado las propiedades en vez de que yo las obtenga poniendo su nombre???

kriogeN
09/02/12, 20:47:21
Todos los métodos de la clase JSONObject funcionan con una key, y realmente tiene sentido que sea así.

El JSON es como el XML (realmente es una forma más básica de XML, y por eso me pasé a XML porque lo veía más claro y porque puedes construirte objetos de deserialización de una forma muy sencilla), si tu programas una deserialización de un JSON va a ser para un JSON en concreto, no para algo genérico.

Un JSON (y un XML) no importa el orden, ni siquiera importa que una propiedad esté o no este (te devolverá NULL si no está). Lo que importa es que si tu buscas una propiedad la encuentres, da igual el orden en el que la generó el generador (valga la redundancia) del JSON.

No se si queda claro el concepto, pero creo que si.

gohan0189
09/02/12, 21:14:18
mmm ps mas o menos, entonces eso seria como respuesta que no hay una forma???

gohan0189
13/02/12, 18:04:28
podrias explicarme mas de esto que me mencionas????

gohan0189
13/02/12, 21:02:00
hola lo que pasa es que ahora ando realizando un contador y me va bien pero lo que quiero es que cuando pulsen la pantalla se detenga, y lo unico q hace es que me sale el mensaje de pausa pero no se detiene podrian ayudarmeee??


public class TouchActivity extends Activity
{
/** Called when the activity is first created. */
boolean on,off;
TextView tv,tvtxt;
int con;

MotionEvent event;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv= (TextView) findViewById(R.id.contador);
tvtxt= (TextView) findViewById(R.id.text);
//hilo();
off=true;
background.start();

}

@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN)

if(tvtxt.getText().equals(""))
{
off = false;
tvtxt.setText("Pausa");
}
else
{

off=true;
tvtxt.setText("");

}
return super.onTouchEvent(event);

}


Thread background = new Thread ()
{
@Override
public void run ()
{


while(off=true)
{
try {

Thread.sleep(1000);
con=con+1;

handler.sendEmptyMessage(0);

} catch (Exception ex)
{
ex.printStackTrace();
//Termina el thread en background
}



}

}

};


private Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
tv.setText(Integer.toString(con));
}
};
}


este es mi codigoo

kriogeN
14/02/12, 00:06:44
while(off=true)

Eso debería ser off==true.

Con off=true estás haciendo la asignación, y una asignación a true devuelve true.

Es más, simplemente poniendo while(off) ya es suficiente, porque off es un booleano y por tanto ya contiene true o false.

gohan0189
14/02/12, 00:17:47
si disculpa no habia observado eso, pero ahora si me lo pausa pero no lo reanuda alguna idea del porque??

gohan0189
14/02/12, 00:23:00
aaaa si perdon no me habia fijado en eso, mm ahora ya se lo puse pero mm me lo pausa pero no lo reanuda, alguna idea del porque??

gohan0189
14/02/12, 00:25:26
aaaa no me habia fijado en eso jejejeje perdon , bueno pero ahora que se lo puse me pausa el hilo pero no me lo reanuda , alguna idea del porque??? que estoy haciendo mal??

gohan0189
14/02/12, 00:28:41
aaaa no me habia fijado en eso jejejeje perdon , bueno pero ahora que se lo puse me pausa el hilo pero no me lo reanuda , alguna idea del porque??? que estoy haciendo mal??

kriogeN
14/02/12, 01:17:38
if(tvtxt.getText().equals("")) { off = false; tvtxt.setText("Pausa"); } else { off=true; tvtxt.setText(""); }

Cambia el primer if por:

if (off)

El resto dejalo igual.

gohan0189
14/02/12, 18:01:37
que crees que no :( , solo me lo pausa

gohan0189
14/02/12, 18:28:37
lo que pasa es que una vez que entra al touchevent ya no regresa el thread