JSON lectura con JavaScript

legent

Bueno estaba haciendo unas pruebas con el json y la lectura con javascript y es una locura no me funciona, tengo en cuenta este codigo:

Codigo ejemplo

Y bueno ahora este es el codigo que estoy haciendo y que no me funciona ( es otro json ):

mi codigo

No quiero para nada que me lo resolváis, solo pido a ver que fallos le encontráis ya que me estoy volviendo loco xD
( creo que para mostrar todas las perdonas bien tabuladas tengo que anidar otro for dentro del que hay

zoeshadow

Creo que ese JSON está mal hecho, las claves tienen que ser unicas, en este caso las claves "P" y "Persona" se están sobreescribiendo.

Es como si hicieses:

var p;
p = "texto1";
p = "texto2";

console.log(p); // Te devolverá:  texto2
2 respuestas
KaLaTa

yo te recomendaría que o bien utilizaras un for each para recorrer las posiciones del objeto o bien siguieras esta estructura:

for(i=0; i<myArray.length; i++)
 {
	myArray[i] = "Do Something Here".
}

Tal y como lo has hecho no estoy seguro que entienda las condiciones de tu for.

2 respuestas
elkaoD

Eso no es JSON, es JavaScript a secas.

El HTML que generas está mal (abres <p> pero no lo cierras).

Además...

JSONObject[i].PERSONAE.PERSONA + "," +
document.write("<li>" + cad + "</li>");

...está rematadamente mal. No puedes usar + contra document.write. Es un statement separado. Debería ser ; y no +.

Además, como te dice #2 el objeto está mal (claves repetidas).


#3, ya está usando foreach: for (x in y). Si te refieres a Array.forEach sí, es más cómodo, pero también más lento y no aporta nada (aunque yo lo usaría xD pero está bien conocer ambos).

#1 lo ideal de los for-in es comprobar y.hasOwnProperty(x). Hay casos (por ejemplo si alguien extiende el prototipo de Array en alguna de tus librerías, que no debería) en que se cuelan propiedades de objetos padre.

1 respuesta
JuAn4k4
<script type="text/javascript">
var objetos= [{        
title: "The Tragedy of Hamlet, Prince of Denmark", fm: [ "Text placed in the public domain by Moby Lexical Tools.", "XML version by Jon Bosak" ], personas: [ { name: "CLAUDIUS, king of Denmark. " }, { name::"HAMLET, son to the late, and nephew to the present king."}, { name::"HORATIO, friend to Hamlet."}, { name::"LUCIANUS, nephew to the king."} ]
}]; </script> </head> <body> <h2>Lectura fitxer</h2> <script type="text/javascript"> var html = new Array(); html.push("<ul>"); for(i=0; i<objetos.length; i++) var obj = objetos[i]; html.push("<li>"); html.push("<h4">"); html.push(obj.title); html.push("</h4"); for(j=0; j<obj.fm.length; j++) { var fm= obj.fm[j]; html.push("<p>"); html.push(fm); html.push("</p>"); } for(k=0; k<obj.personas.length; k++) { var persona = obj.personas[k]; html.push("<p>"); html.push(persona.name); html.push("</p>"); } html.push("</li>"); } html.push("</ul>"); document.write(html.join('')); </script>

No hace falta usar "" cuando creas un objeto en javscript.
No necesitas usar JSONObject
El foreach en IE se comporta un poco raro
Tienes propiedades repetidas, un objeto es como un diccionario/hashmap, tienes una clave primaria (Nombre propiedad) y su valor.
El html que generas se rompe
Intenta utilizar un Array para crear cadenas como si fuera un StringBuilder (Metes cadenas en el array, y al final las unes con el join(""), es más rápido que concatenar strings.

Tu objeto esta muy liado y no se entiende, si tienes un array/lista es una lista, no una propiedad :

"personae" : [ { "name": "Juan" } , { "name" : "Pedro" }, { "name": "Julian" } ]

en lugar de :

"personae" : { "persona" : "Juan", "persona" : "Pedro", "persona" : "Julian" }

2 respuestas
elkaoD

#5 "No necesitas usar JSONObject"

Solo es el nombre de su variable.

1 respuesta
legent

#5 #2 #3 #4 Tal vez los fallos son un poco gordos y tal, pero es que tal cual llego la profesora el jueves a clase y dijo sin haber explicado tan siquiera 5 min JSON y Javascript ( no tenemos ni puta idea de como hacer javascript );

Chicos teneis esta tarea para la semana que viene

spoiler

Total que me estoy volviendo loco. Bueno voy a seguir echándole un vistazo

Gracias por todo

Edit

He modificado el codigo de #5 un pelin pero sigue sin funcionarme solo me devuelve el titulo y no me salen mensajes de error en la consola :S

spoiler
JuAn4k4

#6 Grande jajaja, lo que me he podido reir, en que estaría yo pensando.

No es por ser gañan, pero me hacen a mi eso y hago

Google > XML to JSON > http://www.utilities-online.info/xmltojson/#.UZx0j5O9mgQ

{
  "PLAY": {
    "TITLE": "The Tragedy of Hamlet, Prince of Denmark",
    "FM": {
      "P": [
        "Text placed in the public domain by Moby Lexical Tools.",
        "XML version by Jon Bosak"
      ]
    },
    "PERSONAE": {
      "PERSONA": [
        "CLAUDIUS, king of Denmark. ",
        "HAMLET, son to the late, and nephew to the present
king.",
        "HORATIO, friend to Hamlet.",
        "LUCIANUS, nephew to the king."
      ]
    }
  }
}

Y auí el script:


var json = {
  "PLAY": {
    "TITLE": "The Tragedy of Hamlet, Prince of Denmark",
    "FM": {
      "P": [
        "Text placed in the public domain by Moby Lexical Tools.",
        "XML version by Jon Bosak"
      ]
    },
    "PERSONAE": {
      "PERSONA": [
        "CLAUDIUS, king of Denmark. ",
        "HAMLET, son to the late, and nephew to the present king.",
        "HORATIO, friend to Hamlet.",
        "LUCIANUS, nephew to the king."
      ]
    }
  }
}

if (console)
  console.log(json);


var html = new Array();
html.push("<h2>");
html.push(json.PLAY.TITLE);
html.push("</h2>");

if (console)
  console.log(" Length of fm.p : " + json.PLAY.FM.P.length);

for(i=0; i<json.PLAY.FM.P.length; i++)
{
	html.push("<p>");
	html.push(json.PLAY.FM.P[i]);
	html.push("</p>");

}
html.push("<h4>Personajes</h4>");
html.push("<ul>");
for(i=0; i<json.PLAY.PERSONAE.PERSONA.length; i++)
{
	html.push("<li>");
	html.push(json.PLAY.PERSONAE.PERSONA[i]);
	html.push("</li>");
}
html.push("</ul>");

var generatedHTML = html.join("");

if (console)
  console.log(generatedHTML);

document.write(generatedHTML);

PD: Aquí lo puedes ver funcionando:
http://jsfiddle.net/jNtgy/

Usuarios habituales

  • JuAn4k4
  • legent
  • elkaoD
  • KaLaTa
  • zoeshadow