簡體   English   中英

如何在 C# 中不使用科學記數法將字符串反序列化為 JObject

[英]How to deserialize string to JObject without scientific notation in C#

我有一個這樣的字符串:

var str = "{'data': {'someProperty': 0.00001}}";

當我像那樣將它解析為 JObject 時

var jObject = JObject.Parse(str);

我的 jObject 看起來像這樣:

{"data": {"someProperty": 1E-05}}

我需要擺脫科學記數法,以便生成的 JObject 看起來像原始 json。

我設法使用更高版本的 Newtonsoft.Json 做到了這一點:

var serializer = new JsonSerializer { FloatParseHandling = FloatParseHandling.Decimal };
using (System.IO.TextReader tr = new System.IO.StringReader(str)
using (var jsonReader = new JsonTextReader(tr))
{
    var jp = serializer.Deserialize(jsonReader);
    var jObject = JObject.FromObject(jp);
}

但是我需要使用沒有 FloatParseHandling 屬性的 Newtonsoft.Json 3.5 版來實現相同的結果。 我想我需要以某種方式實現 JsonConverter,但我不知道該怎么做,因為我真正的 json 比示例中的要復雜得多,我需要以正確的方式處理其中的所有浮點值。

那么,使用 Newtonsoft 3.5 在沒有浮點值科學記數法的情況下獲取 JObject 的正確方法是什么?

以下生成您正在尋找的對象

JObject.Load(new JsonTextReader(new StringReader(str)) { FloatParseHandling = FloatParseHandling.Decimal }, null)

取自這里:

編輯:NewtonSoft v 3.5.8 中的 JTokenTypes 僅限於 Float 和 Integer(關於十進制)。 該版本中沒有十進制類型,因此在該 JObject 中不可能有十進制值。

newtonsoft v3 中的 JTokenTypes

    None = 0,
    Object = 1,
    Array = 2,
    Constructor = 3,
    Property = 4,
    Comment = 5,
    Integer = 6,
    Float = 7,
    String = 8,
    Boolean = 9,
    Null = 10,
    Undefined = 11,
    Date = 12,
    Raw = 13,
    Bytes = 14

正確的方法是升級 Newtonsoft 包:)

Jawad 提供的代碼不是最好的解決方案,因為它最終會導致內存泄漏。 StringReaderJsonTextReader都實現了IDisposable接口,因此如果不使用它們,則必須對其進行處理。 更安全的代碼是:

public JObject CustomJObjectLoad(string str)
{
    using (var stringReader = new StringReader(str))
    {
        using (var jsonReader = new JsonTextReader(stringReader) { FloatParseHandling = FloatParseHandling.Decimal })
        {
            return JObject.Load(jsonReader, null);
        }
    }
}

首先,您的 json 無效 :) 它應該有雙引號:

{"data": {"someProperty": 0.00001}}

但更好的是,使用標准外殼,將是:

{"Data": {"SomeProperty": 0.00001}}

然后,我們可以這樣做:

var str = "{\"Data\": {\"SomeProperty\": 0.00001}}";
dynamic myObject = JsonConvert.DeserializeObject(str);
var val = myObject.Data.SomeProperty.ToString("0." + new string('#', 339));

val將是: "0.00001"

(注意:我從以下地址中竊取了解決方案: Double to string conversion without science notation

您還可以創建簡單的 POCO 對象。 並確保someProperty是字符串類型,然后反序列化 json 字符串

var myObject = Newtonsoft.Json.JsonConvert.DeserializeObject<YourObject>(json)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM