Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,020

    [VB.NET] Parsing di stringa JSON con libreria Newtonsoft senza classe di appoggio

    Ciao.
    Ho una stringa formato json. Il mio obiettivo è fare il parsing di questa stringa, con Newtonsoft, senza classe ausiliaria e supponendo di non conoscerne la struttura.
    Il codice di sotto sembra funzionare ma, a dire la verità non mi convince. Chiedo se si possa semplificare.

    codice:
    Option Strict On
    Imports Newtonsoft.Json
    Imports Newtonsoft.Json.Linq
    
    Module Module1
    
        Sub Main()
            Dim s As String = "{""nome"":""Pietro"", ""numero"":9.3, ""vettore"":[1, 2], ""testonull"":null, ""geometry"":{""x"":8.5,""y"":40.5},""attributes"":{""objectId"":1,""testo1"":null,""testo2"":""xxx"",""numero1"":null,""numero2"":44.6}}"
            Prova(s)
            Console.Write("Premere un tasto per continuare . . . ") : Console.ReadKey()
        End Sub
    
    
        Private Sub Prova(s As String)
            Dim o As JObject = JObject.Parse(s)
            For Each j In o.Children
                Dim value As JToken = Nothing
                Dim name As String = j.Path
                o.TryGetValue(name, value)
    
                Console.WriteLine("j.Path: {0}", j.Path)
                Console.WriteLine("o(j.Path).ToString: {0}", o(j.Path).ToString)
                Console.WriteLine("value.ToString: {0}", value.ToString)
                Console.WriteLine("value.Type: {0} ({1})", value.Type.ToString, CInt(value.Type))
                Console.WriteLine()
    
                If value.Type = JTokenType.Object Then
                    Prova(value.ToString)
                End If
            Next
    
        End Sub
    
    End Module
    Pietro

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,871
    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    Ciao.
    Il codice di sotto sembra funzionare ma, a dire la verità non mi convince. Chiedo se si possa semplificare.
    Dal mio punto di vista, la chiamata al TryGetValue() dovrebbe fare uso consono del valore di ritorno.

    Un'altra possibile miglioria potrebbe essere quella di lavorare con oggetti e non con stringhe, ad esempio chiamando il metodo Prova() passando l'oggetto (JObject) e non la stringa, almeno quando si invoca il metodo la seconda volta per gli elementi figli e il parsing dell'intero JSON è già stato effettuato, quindi non c'è bisogno di ripeterlo.

    Al netto di questo, non so bene che utilità possa avere questa routine in generale e quali sono i tuoi dubbi specifici riguardo l'implementazione, dato che tu stesso dici che funziona.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,020
    Ti ringrazio della risposta.
    Il servizio che interrogo mi restituisce un json, che alla fine, non è altro che una serie di chiave-valore, in pratica campi di una tabella.
    Io vorrei semplicemente ottenere tutte le chiavi e i valori e, se i valori sono oggetti, tutte le chiavi e valori di quell'oggetto.
    Perdonami se la mia chiarezza lascia a desiderare. Ciao
    Pietro

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,871
    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    Il servizio che interrogo mi restituisce un json, che alla fine, non è altro che una serie di chiave-valore, in pratica campi di una tabella.
    Io vorrei semplicemente ottenere tutte le chiavi e i valori e, se i valori sono oggetti, tutte le chiavi e valori di quell'oggetto.
    Non capisco bene qual è il vantaggio nell'evitare l'uso di un oggetto nel quale (de)serializzare i valori.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,020
    Quote Originariamente inviata da alka Visualizza il messaggio
    Non capisco bene qual è il vantaggio nell'evitare l'uso di un oggetto nel quale (de)serializzare i valori.
    Il vantaggio deriva dalla differenza che c'è tra codice statico e dinamico. E' molto evidente nella costruzione di un json nel caso di aggiornamento. In questo caso il json deve comprendere la chiave e solo i campi da aggiornare.
    Pietro

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,871
    Quote Originariamente inviata da pietro09
    Il vantaggio deriva dalla differenza che c'è tra codice statico e dinamico.
    Sì, ma se poi tu "dinamicamente" devi accedere a valori e proprietà specifici, in quel caso non ti serve a nulla.

    Quote Originariamente inviata da pietro09
    E' molto evidente nella costruzione di un json nel caso di aggiornamento. In questo caso il json deve comprendere la chiave e solo i campi da aggiornare.
    Nulla vieta di costruirsi una semplice classe DTO che memorizzi i parametri da utilizzare per aggiornare una specifica entità.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,020
    la verità è che sono in ferie e non ho di meglio da fare che sperimentare

    ps. e dire che qui siamo in piena primavera
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.