Saludos comunidad Rubysur.
Desde hace tiempo he estado generando json con rails para pequeñas aplicaciones (todas en javascript) usando "render :json", hasta hace poco que empece a trabajar en un proyecto movil para Android, donde quisiera usar ruby on rails como webservices para generar y guardar informacion y conectar con la app movil.
Estuve haciendo pruebas ya que anteriormente usaba php para generar las cadenas en json y usar con java, use una misma estructura que me funciona en javascript,desde un metodo en rails, que es este:
def renderjson
prueba='{"negocios":[{"id":"1","nombre":"nombre del negocio","url":"imagen.jpg","description":"descripcion del negocio"}]}'
render json: prueba
end
y en Java, uso esta clase
--------------------------------------------------------------------------------
public class JSONParserUrl {
public final String TAG_PRINCIPAL = "negocios";
public final String TAG_ID = "id";
public final String TAG_NOMNEGOCIO = "nombre";
public final String TAG_URL = "url";
public final String TAG_LAT = "lat";
public final String TAG_LNG = "lng";
public final String TAG_DESCRIPTION = "description";
ArrayList<String> list = new ArrayList<String>();
ArrayList<String> listThumb=new ArrayList<String>();
ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
String descripcion,titulo,thumb;
JSONArray user = null;
JSONParser jParser = new JSONParser();
JSONObject json;
public JSONParserUrl(String url){
json = jParser.getJSONFromUrl(url);
parserAll();
}
public JSONParserUrl(String url,boolean solo){
json = jParser.getJSONFromUrl(url);
if(solo){
parserSolo();
}else{
parserAll();
}
}
void parserSolo(){
try {
user = json.getJSONArray(TAG_PRINCIPAL);
JSONObject c;
for(byte i=0;i<user.length();i++){
c = user.getJSONObject(i);
titulo = c.getString(TAG_NOMNEGOCIO);
thumb=c.getString(TAG_URL);
descripcion=c.getString(TAG_DESCRIPTION);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
void parserAll(){
try {
// Getting JSON Array
user = json.getJSONArray(TAG_PRINCIPAL);
JSONObject c;
String name,thumbUrl;
for(byte i=0;i<user.length();i++){
c = user.getJSONObject(i);
name = c.getString(TAG_NOMNEGOCIO);
thumbUrl=c.getString(TAG_URL);
list.add(name);
listThumb.add(thumbUrl);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
public ArrayList<String> listaJSON(){
return list;
}
public ArrayList<String> listaThumb(){
return listThumb;
}
public String getDescription(){
return descripcion;
}
public String getTitulo(){
return this.titulo;
}
public String getThumb(){
return this.thumb;
}
}
-----------------------------------------------------------------------------------
Usando esta clase y llamandola desde Java, me arroja un error NullPointer(nunca parsea el json), para descartar error de java, use la misma cadena y la use en php para imprimir el json: echo json_encode($cadena) , la cadena es la misma que en rails, y funciona en Java; ¿de que manera se tiene que parsear en Ruby on Rails? con Javascript me funciona bien, no habia tenido este problema, no se si en realidad no me convierta la cadena de caracteres a json en rails.
Dato extra si manejan Java:
Para parsear uso una clase que he tenido desde hace tiempo, usando el estandar iso-8859-1,igual en php sin añadirle ni una linea extra me funciona:
------------------------------------------------------------------------------------
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
public JSONObject getJSONFromUrl(String url) {
// Making HTTP request
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
}
--------------------------------------------------------------------------
Gracias por leer el mensaje.