Spanish Trabajando con JSON

Santiago Russo

Member
Licensed User
Buenos días. Mi consulta es la siguiente. Estoy armando las estructuras JSON. Para ello uso JSONGenerator. El tema es que no consigo poner como corresponde los corchetes "[]" para indicar el array de mi estructura.
Lo hago gráfico:
JSON:
{"data":
    {    "valor": "hola",
        "documento": 123456,
        "Items": [{"1": "a"},
                 {"2": "b"},
                 {"3": "c"}
                 ]
    }
}

Lo que no puede armar es la parte de los "[]"
Muestro el código:

B4A:
'Mi JSON
    'Dim Data As List
    Private MiJSON As Map
   
    Private JS As String
    MiJSON.Initialize
    MiJSON.Put("valor", "Hola")
    MiJSON.Put("Documento", 123456)
   
' Aquí un mal intento hacer lo de los corchetes, sin éxito
'    Private Items As Map
'    Items.Initialize
'    Items.Put("1", "a")
'    Items.Put("2", "b")
'    JSONGenerator.Initialize(Items)
'    JS = JSONGenerator.ToPrettyString(2)
'    Log(JS)
'    JS = "[" & JS & "]"
'    Data.Initialize
'    Data.Add(JS)
'    MiJSON.Put("Items",  JS)
   
    Private JSONGenerator As JSONGenerator
   
    JSONGenerator.Initialize(MiJSON)
   
    Log("MiJSON")
    JS = JSONGenerator.ToPrettyString(2)
    Log(JS)
   
    Private MiJSON2 As Map
    MiJSON2.Initialize
    MiJSON2.Put("data", MiJSON)
    JSONGenerator.Initialize(MiJSON2)
    JS = JSONGenerator.ToPrettyString(2)
    Log(JS)

Agradecería me indicaran como se forma el array dentro del JSON. Hasta ahora no lo logré.
Desde ya, muchas gracias nuevamente.
 

josejad

Expert
Licensed User
Longtime User
¿has probado esta herramienta? Pegas tu jSON y te genera el código:

Viene de aquí:

1583845108131.png
 

Jorge M A

Well-Known Member
Licensed User
{"data": { "valor": "hola", "documento": 123456, "Items": [{"1": "a"}, {"2": "b"}, {"3": "c"} ] } }
No creo que te debas preocupar por poner tu los corchetes "[]", a menos de que sea una estructura "especial".
Parece un tanto extraña la estructura del json, especificamente en el arreglo de "Items". ¿Estás seguro que es correcta, o cómo la obtienes?

Lo más parecido es con un código como este:

B4X:
Sub DoJson
    Private MiJSON As Map
    Private data As Map
    Private JS As String
    
    MiJSON.Initialize
    data.Initialize
    
    data.Put("valor", "Hola")
    data.Put("Documento", 123456)
 
    MiJSON.Put("data",data)
    
    Private Items As List
    Items.Initialize
    
    Private subItem As Map
    subItem.Initialize
    subItem.Put("1","a")
    subItem.Put("2","b")
    subItem.Put("3","c")
    
    Items.Add(subItem)
            
    data.Put("Items", Items)
    
    Private JSONGenerator As JSONGenerator
  
    JSONGenerator.Initialize(MiJSON)
  
    Log("MiJSON")
    JS = JSONGenerator.ToPrettyString(2)
    Log(JS)
  
End Sub
Waiting for debugger to connect...
Program started.
MiJSON
{
"data": {
"valor": "Hola",
"Items": [
{
"1": "a",
"2": "b",
"3": "c"
}
],
"Documento": 123456
}
}
 

Santiago Russo

Member
Licensed User
Hola. Claro. La he probado. Pero esa me "desarma" un JSON, lo que yo necesito es "armarlo". Exactamente al revés.
De ahí mi duda.
 

Santiago Russo

Member
Licensed User
No creo que te debas preocupar por poner tu los corchetes "[]", a menos de que sea una estructura "especial".
Parece un tanto extraña la estructura del json, especificamente en el arreglo de "Items". ¿Estás seguro que es correcta, o cómo la obtienes?

Lo más parecido es con un código como este:

B4X:
Sub DoJson
    Private MiJSON As Map
    Private data As Map
    Private JS As String
   
    MiJSON.Initialize
    data.Initialize
   
    data.Put("valor", "Hola")
    data.Put("Documento", 123456)

    MiJSON.Put("data",data)
   
    Private Items As List
    Items.Initialize
   
    Private subItem As Map
    subItem.Initialize
    subItem.Put("1","a")
    subItem.Put("2","b")
    subItem.Put("3","c")
   
    Items.Add(subItem)
           
    data.Put("Items", Items)
   
    Private JSONGenerator As JSONGenerator
 
    JSONGenerator.Initialize(MiJSON)
 
    Log("MiJSON")
    JS = JSONGenerator.ToPrettyString(2)
    Log(JS)
 
End Sub
Waiting for debugger to connect...
Program started.
MiJSON
{
"data": {
"valor": "Hola",
"Items": [
{
"1": "a",
"2": "b",
"3": "c"
}
],
"Documento": 123456
}
}

Esta es la estructura real que debo armar para enviar:

JSON:
{
    "data": {
        "id": 61,
        "user_id": 61,
        "profession_id": null,
        "ocupation": null,
        "province_id": null,
        "work_hour_id": null,
        "working_term_id": null,
        "computing_level": 0,
        "salary": 0,
        "travel": 0,
        "gender": null,
        "created_at": "2020-03-04 19:43:06",
        "updated_at": "2020-03-04 19:43:06",
        "languages": []
    }
}

En "languages", viene una serie de datos sobre los mismos, de ahí que es un array.
 

Jorge M A

Well-Known Member
Licensed User
Ok!, esto tiene más sentido. Ahora, si lo que te está dando guerra es el array de "languages", proporciónanos la estructura de ese array para intentar ayudarte de manera mas completa. En tu primer ejemplo, se "desarma" generando errores.
También puedes ver en el código que te puse anteriormente, cómo está la lista de Items, compuesta por un Map.
 

Santiago Russo

Member
Licensed User
Ok!, esto tiene más sentido. Ahora, si lo que te está dando guerra es el array de "languages", proporciónanos la estructura de ese array para intentar ayudarte de manera mas completa. En tu primer ejemplo, se "desarma" generando errores.
También puedes ver en el código que te puse anteriormente, cómo está la lista de Items, compuesta por un Map.

Ahora sí. Les mando el JSON como realmente se ve. Esto es medio complicado porque los datos los manejan en otro lado...
JSON:
{
    "data": {
        "id": 61,
        "user_id": 61,
        "profession_id": null,
        "ocupation": null,
        "province_id": null,
        "work_hour_id": null,
        "working_term_id": null,
        "computing_level": 0,
        "salary": 0,
        "travel": 0,
        "gender": null,
        "created_at": "2020-03-04 19:43:06",
        "updated_at": "2020-03-04 19:43:06",
        "languages": [
            {
                "id": 1,
                "name": "Inglés",
                "state": "Active",
                "created_at": null,
                "updated_at": null,
                "pivot": {
                    "candidate_id": 61,
                    "language_id": 1
                }
            },
            {
                "id": 2,
                "name": "Frances",
                "state": "Active",
                "created_at": null,
                "updated_at": null,
                "pivot": {
                    "candidate_id": 61,
                    "language_id": 2
                }
            }
        ]
    }
}

A ver si con esto la cosa puede quedar completa.
Gracias.
 

Jorge M A

Well-Known Member
Licensed User
Nota por favor, la estructura de mapas incrustados en mapas, y la colcación de la List.
B4X:
Sub DoJson
    Private root As Map
    Private data As Map
    Private languages As List
    Private pivot As Map
    
    Private JS As String
    
    root.Initialize
    data.Initialize
    
    data.Put("id", 61)
    data.Put("user_id", 61)
    data.Put("profession_id", Null)
    data.Put("ocupation", Null)
    data.Put("province_id", Null)
    data.Put("work_hour_id", Null)
    data.Put("working_term_id", Null)
    data.Put("computing_level", 0)
    data.Put("salary", 0)
    data.Put("travel", 0)
    data.Put("gender", Null)
    data.Put("created_at", "2020-03-04 19,43,06")
    data.Put("updated_at", "2020-03-04 19,43,06")
    
    languages.Initialize
    pivot.Initialize
    
    languages.Add(CreateMap("id": 1, "name": "Inglés",  "state": "Active", "created_at": Null, "updated_at": Null, "pivot" : CreateMap("candidate_id": 61, "language_id": 1)))
    languages.Add(CreateMap("id": 2, "name": "Frances", "state": "Active", "created_at": Null, "updated_at": Null, "pivot" : CreateMap("candidate_id": 61, "language_id": 2)))
    
    data.Put("languages",languages)
 
    root.Put("data",data)
    
    
    Private JSONGenerator As JSONGenerator
  
    JSONGenerator.Initialize(root)
  
    Log("MiJSON")
    JS = JSONGenerator.ToPrettyString(2)
    Log(JS)
  
End Sub

Waiting for debugger to connect...
Program started.
MiJSON
{
"data": {
"ocupation": null,
"gender": null,
"languages": [
{
"updated_at": null,
"name": "Inglés",
"created_at": null,
"pivot": {
"candidate_id": 61,
"language_id": 1
},
"id": 1,
"state": "Active"
},
{
"updated_at": null,
"name": "Frances",
"created_at": null,
"pivot": {
"candidate_id": 61,
"language_id": 2
},
"id": 2,
"state": "Active"
}
],
"created_at": "2020-03-04 19,43,06",
"salary": 0,
"updated_at": "2020-03-04 19,43,06",
"user_id": 61,
"profession_id": null,
"province_id": null,
"id": 61,
"work_hour_id": null,
"working_term_id": null,
"travel": 0,
"computing_level": 0
}
}
 

Santiago Russo

Member
Licensed User
Nota por favor, la estructura de mapas incrustados en mapas, y la colcación de la List.
B4X:
Sub DoJson
    Private root As Map
    Private data As Map
    Private languages As List
    Private pivot As Map
   
    Private JS As String
   
    root.Initialize
    data.Initialize
   
    data.Put("id", 61)
    data.Put("user_id", 61)
    data.Put("profession_id", Null)
    data.Put("ocupation", Null)
    data.Put("province_id", Null)
    data.Put("work_hour_id", Null)
    data.Put("working_term_id", Null)
    data.Put("computing_level", 0)
    data.Put("salary", 0)
    data.Put("travel", 0)
    data.Put("gender", Null)
    data.Put("created_at", "2020-03-04 19,43,06")
    data.Put("updated_at", "2020-03-04 19,43,06")
   
    languages.Initialize
    pivot.Initialize
   
    languages.Add(CreateMap("id": 1, "name": "Inglés",  "state": "Active", "created_at": Null, "updated_at": Null, "pivot" : CreateMap("candidate_id": 61, "language_id": 1)))
    languages.Add(CreateMap("id": 2, "name": "Frances", "state": "Active", "created_at": Null, "updated_at": Null, "pivot" : CreateMap("candidate_id": 61, "language_id": 2)))
   
    data.Put("languages",languages)

    root.Put("data",data)
   
   
    Private JSONGenerator As JSONGenerator
 
    JSONGenerator.Initialize(root)
 
    Log("MiJSON")
    JS = JSONGenerator.ToPrettyString(2)
    Log(JS)
 
End Sub

Waiting for debugger to connect...
Program started.
MiJSON
{
"data": {
"ocupation": null,
"gender": null,
"languages": [
{
"updated_at": null,
"name": "Inglés",
"created_at": null,
"pivot": {
"candidate_id": 61,
"language_id": 1
},
"id": 1,
"state": "Active"
},
{
"updated_at": null,
"name": "Frances",
"created_at": null,
"pivot": {
"candidate_id": 61,
"language_id": 2
},
"id": 2,
"state": "Active"
}
],
"created_at": "2020-03-04 19,43,06",
"salary": 0,
"updated_at": "2020-03-04 19,43,06",
"user_id": 61,
"profession_id": null,
"province_id": null,
"id": 61,
"work_hour_id": null,
"working_term_id": null,
"travel": 0,
"computing_level": 0
}
}

De 10. Lo analizo y luego comento. Mil gracias.
 
Top