Android Question Error parsing JSON with one Item and multiples Items

victormedranop

Well-Known Member
Licensed User
Longtime User
Hi, i have this case where i can parse json with more than one data on. but when i try one only dows not work.

json with only one
B4X:
    Dim DD As String = $"
    {"DatoSorteo":
        {"descripcion":"BINGO MILLONARIO",
        "fechasorteo":"2018-11-11",
        "codigo":"BINGO_M",
        "acumulado":"0",
        "id":"35",
        "numerosorteo":"16",
        "horasorteo":"15:35:00"}
        }
        "$

json with more than one

B4X:
Dim DD As String = $"{
    "DatoSorteo": [
        {
            "descripcion": "BINGO INMOBILIARIO",
            "fechasorteo": "2018-07-10",
            "codigo": "BINGO_I",
            "acumulado": "23000",
            "id": "2",
            "numerosorteo": "1",
            "horasorteo": "15:35:00"
        },
        {
            "descripcion": "BINGO MILLONARIO",
            "fechasorteo": "2018-07-19",
            "codigo": "BINGO_M",
            "acumulado": "150000",
            "id": "3",
            "numerosorteo": "1",
            "horasorteo": "15:35:00"
        },
        {
            "descripcion": "BINGO CAR",
            "fechasorteo": "2018-08-20",
            "codigo": "BINGO_C",
            "acumulado": "100000",
            "id": "20",
            "numerosorteo": "1",
            "horasorteo": "15:35:00"
        }
    ]
}"$


and here is my parse code

B4X:
    Dim parser As JSONParser
    parser.Initialize(DD)
    Dim root As Map = parser.NextObject
    Dim colDatoSorteo As List = root.Get("DatoSorteo")
    For Each colDatoSorteo As Map In XDatoSorteo
        Log(colDatoSorteo.Get("descripcion"))
        Log(colDatoSorteo.Get("fechasorteo"))
        Log(colDatoSorteo.Get("codigo"))
        Log(colDatoSorteo.Get("acumulado"))
        Log(colDatoSorteo.Get("id"))
        Log(colDatoSorteo.Get("numerosorteo"))
        Log(colDatoSorteo.Get("horasorteo"))
    Next

i relly dont know what is happening. this only happen if dd have only one item.

Victor
 

DonManfred

Expert
Licensed User
Longtime User
Ine is a LIST one is a MAP. You neeed to difference them while parsing.
If YOU wrote the ws api. Rewrite it to ALWAYS return a LIST of Maps.
 
Upvote 0

victormedranop

Well-Known Member
Licensed User
Longtime User
I done this with the parsing jsn tool -> http://basic4ppc.com:51042/json/index.html

B4X:
Dim parser As JSONParser 
parser.Initialize(<text>) 
Dim root As Map = parser.NextObject 
Dim DatoSorteo As List = root.Get("DatoSorteo") 
For Each colDatoSorteo As Map In DatoSorteo 
 Dim descripcion As String = colDatoSorteo.Get("descripcion") 
 Dim fechasorteo As String = colDatoSorteo.Get("fechasorteo") 
 Dim codigo As String = colDatoSorteo.Get("codigo") 
 Dim acumulado As String = colDatoSorteo.Get("acumulado") 
 Dim id As String = colDatoSorteo.Get("id") 
 Dim numerosorteo As String = colDatoSorteo.Get("numerosorteo") 
 Dim horasorteo As String = colDatoSorteo.Get("horasorteo") 
Next
 
Upvote 0

DonManfred

Expert
Licensed User
Longtime User
I done this with the parsing jsn tool
sure you did. BUT the api you are using is not consequent. One time it returns a List of Maps, one time it returns only a Map.

Solution;:
- Rewrite the Api (suggested)
- Rewrite your parsing code to handle both cases.
 
Upvote 0

fbritop

Well-Known Member
Licensed User
Longtime User
Try with this:

B4X:
    Dim parser As JSONParser
    parser.Initialize(DD)
    Dim root As Map = parser.NextObject
    Dim DatoSorteo As List = root.Get("DatoSorteo")
    For i=0 To DatoSorteo.Size-1
        Dim colDatoSorteo As Map=DatoSorteo.Get(i)
        Dim descripcion As String = colDatoSorteo.Get("descripcion")
        Dim fechasorteo As String = colDatoSorteo.Get("fechasorteo")
        Dim codigo As String = colDatoSorteo.Get("codigo")
        Dim acumulado As String = colDatoSorteo.Get("acumulado")
        Dim id As String = colDatoSorteo.Get("id")
        Dim numerosorteo As String = colDatoSorteo.Get("numerosorteo")
        Dim horasorteo As String = colDatoSorteo.Get("horasorteo")
    Next
 
Upvote 0

victormedranop

Well-Known Member
Licensed User
Longtime User
I try your demo but got the same error.
(ClassCastException) java.lang.ClassCastException: anywheresoftware.b4a.objects.collections.Map$MyMap cannot be cast to java.util.List

but i cant change de api provider. what a did was this. and works.

thanks fbritop and DonManfred

B4X:
If xx.Length < 220  Then
            Dim parser As JSONParser
            parser.Initialize(xx)
            Dim root As Map = parser.NextObject
            Dim DatoSorteo1 As Map = root.Get("DatoSorteo")
         
            Log("---------------------")
 Else
            Dim parser As JSONParser
            parser.Initialize(xx)
            Dim root As Map = parser.NextObject
            Dim DatoSorteo As List = root.Get("DatoSorteo")
            For Each colDatoSorteo As Map In DatoSorteo
  
            Next
            Log("---------------------")
  End If
 
Upvote 0
Top