[英]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 提供的代碼不是最好的解決方案,因為它最終會導致內存泄漏。 StringReader
和JsonTextReader
都實現了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.