如何在C#中将字符串反序列化为JObject而无需科学记数法

时间:2019-12-06 16:55:30

标签: c# json.net deserialization

我有一个像这样的字符串:

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的正确方法是什么?

4 个答案:

答案 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提供的代码不是最佳解决方案,因为它将最终导致内存泄漏。 StringReaderJsonTextReader都实现了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)