[英]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.