我有一个像这样的字符串:
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);
}
但是我需要使用Newtonsoft.Json 3.5版实现相同的结果,该版本没有FloatParseHandling属性。我想我需要以某种方式实现JsonConverter,但我不知道该怎么做,因为我的真实json比示例中的json复杂得多,并且我需要以正确的方式处理所有float值。>
那么,使用Newtonsoft 3.5在没有科学的浮点值表示法的情况下获取JObject的正确方法是什么?
答案 0 :(得分:2)
以下操作将生成您要查找的对象</ p>
JObject.Load(new JsonTextReader(new StringReader(str)) { FloatParseHandling = FloatParseHandling.Decimal }, null)
取自here:
编辑: 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软件包:)
答案 1 :(得分:1)
Jawad提供的代码不是最佳解决方案,因为它将最终导致内存泄漏。 StringReader
和JsonTextReader
都实现了IDisposable
接口,因此,如果不使用Anmyore,则必须将它们丢弃。
更安全的代码是:
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);
}
}
}
答案 2 :(得分:0)
首先,您的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 scientific notation那里窃取了解决方案)
答案 3 :(得分:0)
您还可以创建简单的POCO对象。并确保someProperty
的类型为字符串,然后反序列化json字符串
var myObject = Newtonsoft.Json.JsonConvert.DeserializeObject<YourObject>(json)