Json parsen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von vico255.

    Nabend, ich versuche gerade eine Api Antwort auszuwerten.
    Das Probelm was ich habe ist, das mir Newtonsoft zu lange dauert (200 ms)

    Ich kenn mich leider mit Redex nicht aus und eventuell kann mir jemand dabei helfen.

    Quellcode

    1. {
    2. "Realtime Currency Exchange Rate": {
    3. "1. From_Currency Code": "EUR",
    4. "2. From_Currency Name": "Euro",
    5. "3. To_Currency Code": "USD",
    6. "4. To_Currency Name": "United States Dollar",
    7. "5. Exchange Rate": "1.11250000",
    8. "6. Last Refreshed": "2019-12-19 17:28:01",
    9. "7. Time Zone": "UTC",
    10. "8. Bid Price": "1.11250000",
    11. "9. Ask Price": "1.11250000"
    12. }
    13. }


    VB.NET-Quellcode

    1. Regex.Matches(data, "\"".*?\""")
    liefert mir "1. From_Currency Code".Wie kann ich die Anführungszeichen vorn und hinten bei den Matches weglassen?Danke für die Hilfe

    *Topic verschoben*
    Mit neuem Topic zusammengefügt ~EaranMaleasi
    In Arbeit...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „EaranMaleasi“ ()

    vico255 schrieb:

    Das Probelm was ich habe ist, das mir Newtonsoft zu lange dauert (200 ms)
    Das kann ich zwar bestätigen, muss es jedoch aber auch wiederlegen.

    Hier meine Tests in .NET Core:


    und .NET 4.8:

    (habe beide mehrfach getestet, die "Cold" Zeiten in .NET Core und .NET FX sind seeeeehr variabel)

    Was hier schnell ersichtlich wird, der zweite Aufruf von Deserialize ist nur mehrere Nanosekunden Schnell. Hier kommen 2 Dinge zum Tragen:

    1. .NET ist eine Interpretierte Sprache. Jede Zeile Code die zum ersten mal ausgeführt wird, muss erst kompiliert werden, und kann dann erst ausgeführt werden. Bei jeder weiteren Ausführung desselben Codes, sofern nichts neu kompiliert werden muss, kommt man meist auf wenige ms.

    2. Json.NET cached die Typen. Dies bedeutet, dass der erste Aufruf von Deserialize zunächst via Reflection die Klasse, in die deserialisiert werden soll, betrachtet, um zu wissen, was von dem JSON in welche Properties gehört. Ist der Typ bereits bekannt, kann JSON.NET natürlich direkt an die Arbeit gehen, ohne nochmal nachsehen zu müssen.

    Edit:
    @vico255 Ich gehe mal davon aus, dass du dein Thema nicht mehr gesehen hast, nachdem es verschoben wurde. Daher habe ich dein neues Thema gelöscht, und die beiden zusammengefügt.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „EaranMaleasi“ ()

    Moin,
    ich bekomm es nicht so hin, wie du es gemacht hast.

    VB.NET-Quellcode

    1. Dim sin As JsonClass.SingleObj = JsonConvert.DeserializeObject(Of JsonClass.SingleObj)(data)

    VB.NET-Quellcode

    1. Public Class SingleObj
    2. Public Property FromCurrencyCode As String
    3. Public Property FromCurrencyName As String
    4. Public Property ToCurrencyCode As String
    5. Public Property ToCurrencyName As String
    6. Public Property ExchangeRate As String
    7. Public Property LastRefreshed As DateTimeOffset
    8. Public Property TimeZone As String
    9. Public Property BidPrice As String
    10. Public Property AskPrice As String
    11. End Class


    Sin ist dann leer.
    In Arbeit...
    Wenn dein JSON-String tatsächlich so aussieht wie in Post #1 wäre mein Vorschlag:

    VB.NET-Quellcode

    1. Public Class RealtimeCurrencyExchangeRate
    2. <JsonProperty("1. From_Currency Code")>Public Property FromCurrencyCode As String
    3. <JsonProperty("2. From_Currency Name")>Public Property FromCurrencyName As String
    4. <JsonProperty("3. To_Currency Code")>Public Property ToCurrencyCode As String
    5. <JsonProperty("4. To_Currency Name")>Public Property ToCurrencyName As String
    6. <JsonProperty("5. Exchange Rate")>Public Property ExchangeRate As Decimal
    7. <JsonProperty("6. Last Refreshed")>Public Property LastRefreshed As DateTimeOffset
    8. <JsonProperty("7. Time Zone")>Public Property TimeZone As String
    9. <JsonProperty("8. Bid Price")>Public Property BidPrice As Decimal
    10. <JsonProperty("9. Ask Price")>Public Property AskPrice As Decimal
    11. End Class
    12. Public Class ExchangeRate
    13. <JsonProperty("Realtime Currency Exchange Rate")>Public Property RealtimeCurrencyExchangeRate As RealtimeCurrencyExchangeRate
    14. End Class

    Und die Deserialisierung:

    VB.NET-Quellcode

    1. Dim ExchangeRateItems = JsonConvert.DeserializeObject(Of ExchangeRate)(data)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Ich habe es auch hinbekommen.

    VB.NET-Quellcode

    1. Dim jobj = JObject.Parse(data)
    2. Dim Sin As JsonClass.SingleObj = JsonConvert.DeserializeObject(Of JsonClass.SingleObj)(jobj("Realtime Currency Exchange Rate").ToString())


    VB.NET-Quellcode

    1. Public Class SingleObj
    2. <JsonProperty(PropertyName:="1. From_Currency Code")>
    3. Public Property FromCurrencyCode As String
    4. <JsonProperty(PropertyName:="2. From_Currency Name")>
    5. Public Property FromCurrencyName As String
    6. <JsonProperty(PropertyName:="3. To_Currency Code")>
    7. Public Property ToCurrencyCode As String
    8. <JsonProperty(PropertyName:="4. To_Currency Name")>
    9. Public Property ToCurrencyName As String
    10. <JsonProperty(PropertyName:="5. Exchange Rate")>
    11. Public Property ExchangeRate As Double
    12. <JsonProperty(PropertyName:="6. Last Refreshed")>
    13. Public Property LastRefreshed As DateTimeOffset
    14. <JsonProperty(PropertyName:="7. Time Zone")>
    15. Public Property TimeZone As String
    16. <JsonProperty(PropertyName:="8. Bid Price")>
    17. Public Property BidPrice As Double
    18. <JsonProperty(PropertyName:="9. Ask Price")>
    19. Public Property AskPrice As Double
    20. End Class
    In Arbeit...