none
Insertar nuevo registro a JSON, vb.net RRS feed

  • Pregunta

  • Puedo crear un registro Json fácilmente, pero como agregar nuevos registros? Modificar o eliminar?

    Tengo los siguiente:

    Public Class Employee
        Public Property firstName As String
        Public Property lastName As String
    End Class

    Public Class Example
        Public Property employees As Employee()
    End Class

    Ahora elaboro un registro asi:

    Dim emp As Employee = New Employee

            emp.firstName = "Luis"
            emp.lastName = "Hermosillo"

            Dim output As String = JsonConvert.SerializeObject(emp)

            Me.TextBox1.Text = output

    Mi resultado correcto es este:

    {"firstName":"Luis Carlos","lastName":"Hermosillo"}

    AHORA... ¿como agrego? Modifico? Elimino?


    Luis C

    domingo, 21 de octubre de 2018 19:00

Respuestas

  • ¿Seran las comillas iniciales y finales?

    Efectivamente, sobran. Si te fijas con un poco de cuidado, verás en seguida donde está el error. Date cuenta de que primero serializas la lista para dar lugar a la variable "output" que es de tipo string. Y después vuelves a serializar la variable de tipo string al grabarla en el fichero, y esta segunda serialización es la que añade las comillas, que son las que sirven en json para representar un string.

    La solución es obvia: sobra la segunda serialización, todo el trabajo ya lo hace la primera.

    File.WriteAllText("c:\a\json.txt", output)

    • Marcado como respuesta Luis Carlos H lunes, 22 de octubre de 2018 6:03
    lunes, 22 de octubre de 2018 5:45

Todas las respuestas

  • El JSON que has creado tiene un único objeto, con dos propiedades. Se reconoce porque empieza y termina por llave {}. Para que contenga varios "registros" como tú dices, necesitas que en lugar de ser un objeto sea una lista de objetos, que se reconoce porque va entre corchetes [], y dentro lleva los varios objetos separados por comas:

    [{"firstName":"Luis","lastName":"Hermosillo"}, {"firstName":"Pedro","lastName":"Perez"}]

    Si eso lo quieres construir con el serializador, tienes que crear en el código un array o una lista y meter dentro los objetos. Después serializas el array o la lista:

    Dim lista as New List(Of Employee)
    lista.Add(emp1)
    lista.Add(emp2)
    Dim output As String = JsonConvert.SerializeObject(lista)

    Para añadir o borrar registros, simplemente los añades o los borras en el List y vuelves a serializar el List.

    .

    domingo, 21 de octubre de 2018 20:01
  • ok, gracias!

    Pero, supongamos que YA hay un archivo (ej. "c:\json.txt") que contiene registros previos, ¿Como agrego los nuevos?

    ¿Debo cargar los anteriores nuevamente y agregar en nuevo registro?

    Puedo deserealizar el anterior asi:

    dim json as string=file.readAlltext("c:\json.txt")

    Dim emp As Employee = JsonConvert.DeserializeObject(Of Employee)(json)

    y a de aqui????? como agrego? el Nuevo?


    Luis C

    domingo, 21 de octubre de 2018 20:56
  • Sí, para añadir registros la forma más fácil es deserializar el fichero, añadir registros a la lista, y volverlo a serializar.

    Pero ojo, inisisto en lo que te dije de que hay que distinguir entre un objeto y una lista de objetos. Aunque la lista solo contenga un único registro, no es equivalente a un registro.

    En otras palabras, no te sirve que el fichero con un único registro tenga esto:

    {"firstName":"Luis Carlos","lastName":"Hermosillo"}

    sino que lo que necesitas es que tenga esto:

    [{"firstName":"Luis Carlos","lastName":"Hermosillo"}]

    Una vez que estés trabajando de esa manera, lo deserializas así:

    Dim lista As List(Of Employee) = JsonConvert.DeserializeObject(Of List(Of Employee))(json)

    y a partir de ahí añades registros mediante

    lista.Add(emp)

    Y finalmente lo vuelves a serializar como te dije en el mensaje anterior.

    Volviendo a tu código original: NO serialices un empleado. Serializa siempre una lista de empleados (aunque la lista solo contenga un único empleado). Esto es necesario si quieres que luego se puedan añadir más registros.
    domingo, 21 de octubre de 2018 21:02
  • Guardo el resultado asi:

    Dim output As String = JsonConvert.SerializeObject(lista)

    File.WriteAllText(("c:\a\json.txt"), JsonConvert.SerializeObject(output, Newtonsoft.Json.Formatting.Indented))

    Pero al cargarlo de nuevo para agregar datos nuevamente, me marca el sig error:

           Dim json As String = File.ReadAllText("c:\a\json.txt")
            'cargo el contenido 
            Dim lista As List(Of Employee) = JsonConvert.DeserializeObject(Of List(Of Employee))(json)

            error:

          Newtonsoft.Json.JsonSerializationException: 'Error converting value "[{"firstName":"Luis Carlos","lastName":"Hermosillo"},{"firstName":"Pedro","lastName":"Perez"}]" to type 'System.Collections.Generic.List`1[TestNewJson.Employee]'. Path '', line 1, position 112.'

    El texto quedo inicalmente guardado "c:\a\json.txt" asi:

    "[{\"firstName\":\"Luis Carlos\",\"lastName\":\"Hermosillo\"},{\"firstName\":\"Pedro\",\"lastName\":\"Perez\"}]"

    ¿Seran las comillas iniciales y finales?


    Luis C




    domingo, 21 de octubre de 2018 22:09
  • ¿Seran las comillas iniciales y finales?

    Efectivamente, sobran. Si te fijas con un poco de cuidado, verás en seguida donde está el error. Date cuenta de que primero serializas la lista para dar lugar a la variable "output" que es de tipo string. Y después vuelves a serializar la variable de tipo string al grabarla en el fichero, y esta segunda serialización es la que añade las comillas, que son las que sirven en json para representar un string.

    La solución es obvia: sobra la segunda serialización, todo el trabajo ya lo hace la primera.

    File.WriteAllText("c:\a\json.txt", output)

    • Marcado como respuesta Luis Carlos H lunes, 22 de octubre de 2018 6:03
    lunes, 22 de octubre de 2018 5:45