sábado, 14 de diciembre de 2019

Parsear manualmente un archivo JSON con Visual Basic



Tenemos un archivo de entrada de tipo JSON y deseamos un listado de ciertas columnas, en este caso están marcadas con la etiqueta de comienzo de “operaciones” (marcada en rojo) :

{
     "
     settings ": {
                "
                campo0 ": ""
                "
                }
          "
     mappings ": {
          "
          operaciones ": {
                " campo1 ": "",
                " campo2 ": "",
                 ...
                 ...
                }       
           }
}

leemos el archivo .json

Dim objStreamReader As StreamReader
Dim path2 As String = "C:\jose Pedro\Proyectos\JSON\ArchivoPrueba.json"
objStreamReader = New StreamReader(path2)

Para recorrer todo el archivo JSON debemos conocer el número de filas que tiene, para ello lo calculamos del siguiente modo

  'Lee el número de filas del archivo JSON
Dim LongFichero As Long
If File.ReadAllLines(path2).Length > 0 Then
      LongFichero = File.ReadAllLines(path2).Length.ToString()
End If

Y ahora lo recorremos con un for
Dim j As Integer
For j = 0 To LongFichero
                   
Next

Dentro del for llemos el archivo .JSON con las instrucciones

'Lee el archivo linea por línea.
 strLine = objStreamReader.ReadLine
 strLine = Trim(strLine)

Para eliminar los Tabs del archivo hacemos esto

 'elimina los Tab del comienzo de las cadenas

 Dim SearchvbTab As String = ControlChars.Tab
 Dim vbTabCharacter As Integer = strLine.IndexOf(SearchvbTab)
 While strLine.IndexOf(SearchvbTab) <> -1
        strLine = strLine.Remove(vbTabCharacter, 1)
 End While

Para que comience a escribir sólo cuando encuentre la palabra clave hacemos esto.

 Dim entra As Boolean
 'solo comienza a escribir cuando encuentra la palabra Operaciones
 Dim FirstCharacter As Integer = strLine.IndexOf(SearchOperaciones)
 If FirstCharacter <> -1 Then
            entra = True
End If

La grabación del nuevo archivo con el listado se hace con estas líneas

strLine = strLine.Remove(SecondCharacter - 5)
Dim info As Byte() = New UTF8Encoding(True).GetBytes(strLine & vbCrLf)
                    fs.Write(info, 0, info.Length)

Hemos detectado que los campos que deseamos listar tienen todos una llave de apertura “{“ en su línea por lo que descartamos todo excepto las líneas que contengan la llave de apertura “{“

Dim SearchForThis As String = "{"

Dim SecondCharacter As Integer = strLine.IndexOf(SearchForThis)
If SecondCharacter <> -1 And entra = True Then

End if

Pero hay campos que no deben aparecer pues son genéricos de JSON pero como también llevan la llave de apertura, no los discrimina y salen, para evitarlo los listamos en un array para que si los encuentra no los escriba.

Dim KeyWords() As String = {"fields", "operaciones", "properties", "raw"}

For Each Item As String In KeyWords
   Dim EncuentraClave As Integer = strLine.IndexOf(Item)
   If EncuentraClave <> -1 Then
           graba = False
           Exit For   'si la encuentra debe salir inmediatamente
    Else
           graba = True
    End If
 Next
               
Finalmente muestro el código completo

Private Sub ParsearJSON()
        Dim objStreamReader As StreamReader
        Dim strLine As String

        'Pass the file path and the file name to the StreamReader constructor.
        Dim path2 As String = "C:\jose Pedro\Proyectos\JSON\ArchivoPrueba.json"
        Dim path As String = "C:\jose Pedro\Proyectos\JSON\ArchivoSalida.txt"
        objStreamReader = New StreamReader(path2)

        ' Create or overwrite the file.
        Dim fs As FileStream = File.Create(path)
        Dim SearchForThis As String = "{"
        Dim SearchOperaciones As String = "operaciones"
        Dim SearchvbTab As String = ControlChars.Tab
        Dim KeyWords() As String = {"fields", "operaciones", "properties", "raw"}
        Dim PalabraClave As String
        Dim j As Integer
        Dim entra As Boolean
        Dim graba As Boolean
        entra = False

        PalabraClave = ""
        'Read the first line of text.
        strLine = objStreamReader.ReadLine

        'Lee el número de filas del archivo JSON
        Dim LongFichero As Long
        If File.ReadAllLines(path2).Length > 0 Then
            LongFichero = File.ReadAllLines(path2).Length.ToString()
        End If

        For j = 0 To LongFichero
            'Write the line to the Console window.
            Console.WriteLine(strLine)
            'Read the next line.
            strLine = objStreamReader.ReadLine
            strLine = Trim(strLine)

            'elimina los Tab del comienzo de las cadenas
            Dim vbTabCharacter As Integer = strLine.IndexOf(SearchvbTab)
            While strLine.IndexOf(SearchvbTab) <> -1
                strLine = strLine.Remove(vbTabCharacter, 1)
            End While


            'solo comienza a escribir cuando encuentra la palabra Operaciones
            Dim FirstCharacter As Integer = strLine.IndexOf(SearchOperaciones)
            If FirstCharacter <> -1 Then
                entra = True
            End If
            Dim SecondCharacter As Integer = strLine.IndexOf(SearchForThis)
            If SecondCharacter <> -1 And entra = True Then
                For Each Item As String In KeyWords
                    Dim EncuentraClave As Integer = strLine.IndexOf(Item)
                    If EncuentraClave <> -1 Then
                        graba = False
                        Exit For   'si la encuentra debe salir inmediatamente
                    Else
                        graba = True
                    End If
                Next
                If graba Then
                    strLine = strLine.Remove(SecondCharacter - 5)
                    Dim info As Byte() = New UTF8Encoding(True).GetBytes(strLine & vbCrLf)
                    fs.Write(info, 0, info.Length)
                End If
            End If
        Next

        'Close the files.
        fs.Close()
        objStreamReader.Close()
        Console.ReadLine()
        MsgBox("parseo terminado correctamente")
    End Sub

El archivo de salida será de este estilo

campo1
campo2
campo3
..

..
campo n

No hay comentarios:

Publicar un comentario