С Newtonsoft.Json, на iOS не десериализовать с инвариантом культуры? - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь прочитать json с финансовой информацией, такой как:

{"cost": 0.0, "price": 417.0, "total": 834.0, "doc_id": 2, "status": "Sync", "doc_code": "ORD-5-1", "doc_kind": "O", "username": "02", "createdat": "2019-01-02T17:09:48.478918", "sub_total": 834.0, "tax_value": 0.0, "updatedat": "2019-01-02T17:10:08.00777-05:00", "customer_code": "43915888_37", "delivery_order": 0, "discount_value": 0.0}

Но она возвращается, например:

"cost": 0.0 //json
cost: 281474976710656 //.NET

Это произошло, если языковой стандарт устройства iOSустановить на испанский / Колумбия.На американском языке это работает.Странно то, что предполагается работать с инвариантной культурой:

https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonSerializerSettings_Culture.htm

Это произошло только на устройстве . С эмулятором все в порядке .

Вот как я пытаюсь:

module test.main

open System

open UIKit
open Foundation

let fromJson2T<'T> x = 
    Newtonsoft.Json.JsonConvert.DeserializeObject<'T>(x)

type DocumentRow = {
    doc_id:int32
    doc_kind:string
    doc_code:string
    customer_code:string
    from_code:string option
    username:string
    createdat:DateTime
    updatedat:DateTime
    dueat:DateTime option
    signature:string option
    authorized:string option
    delivery_order:int32
    price:decimal
    cost:decimal
    tax_value:decimal
    discount_value:decimal
    sub_total:decimal
    total:decimal
    status:string
    notes:string option
    syncdata:string option
    version:int32
}

let DOC = """
{"cost": 0.0, "price": 417.0, "total": 834.0, "doc_id": 2, "status": "Sync", "doc_code": "ORD-5-1", "doc_kind": "O", "username": "02", "createdat": "2019-01-02T17:09:48.478918", "sub_total": 834.0, "tax_value": 0.0, "updatedat": "2019-01-02T17:10:08.00777-05:00", "customer_code": "43915888_37", "delivery_order": 0, "discount_value": 0.0}
"""

[<Register ("AppDelegate")>]
type AppDelegate () =
    inherit UIApplicationDelegate ()

    override val Window = null with get, set

    // This method is invoked when the application is ready to run.
    override this.FinishedLaunching (app, options) =
        let row:DocumentRow = fromJson2T(DOC)
        printfn "%A" row
        true

Я также пытаюсь с

let jsonSettings = JsonSerializerSettings(NullValueHandling = NullValueHandling.Ignore, Culture= System.Globalization.CultureInfo.InvariantCulture)

let fromJson2T<'T> x = 
    Newtonsoft.Json.JsonConvert.DeserializeObject<'T>(x, jsonSettings)

Использование FSHarp.Core 4.5.4, на OSX, Xamarin.IOS 12.2.1.13, Newtonsoft.Json 12.0.1.

PD: Я обновляю образец кода и проверяю, что его очень легко воспроизвести.Я создаю пустой проект iOS, помещаю код в образец.Запустите на эмуляторе, работайте, на устройстве, не работайте.Оба установлены на "(испанский / США)"

PD 2: с https://github.com/vsapronov/FSharp.Json также произошло.Но синтаксический анализ вручную, например, с помощью http://www.fssnip.net/8y/title/JSON-Parser (с плавающей запятой на десятичную), работает нормально.

...