C# 在C语言中如何在没有科学符号的情况下将字符串反序列化到JObject#

C# 在C语言中如何在没有科学符号的情况下将字符串反序列化到JObject#,c#,json.net,deserialization,C#,Json.net,Deserialization,我有这样一个字符串: var str = "{'data': {'someProperty': 0.00001}}"; {"data": {"someProperty": 1E-05}} 当我把它解析成这样的JObject时 var jObject = JObject.Parse(str); 我的作业对象如下所示: var str = "{'data': {'someProperty': 0.00001}}"; {"data": {"someProperty": 1E-05}} 我需要

我有这样一个字符串:

var str = "{'data': {'someProperty': 0.00001}}";
{"data": {"someProperty": 1E-05}}
当我把它解析成这样的JObject时

var jObject = JObject.Parse(str);
我的作业对象如下所示:

var str = "{'data': {'someProperty': 0.00001}}";
{"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比示例中的要复杂得多,我需要以正确的方式处理所有浮点值


那么,使用Newtonsoft 3.5在没有科学的浮点值表示法的情况下获取JObject的正确方法是什么呢?

下面生成您要查找的对象

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

编辑: NewtonSoft v 3.5.8中的jTokenType仅限于浮点和整数(关于十进制)。该版本中没有decimal类型,因此该JObject中不可能有decimal值

来自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包:)

首先,您的json无效:) 它应该有双引号:

{"data": {"someProperty": 0.00001}}
但使用标准套管更好的是:

{"Data": {"SomeProperty": 0.00001}}
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);
        }
    }
}
然后,我们可以这样做:

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


(注意:我从以下位置窃取了解决方案:)

您还可以创建简单的POCO对象。并确保
someProperty
的类型为string,然后反序列化json字符串

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

Jawad提供的代码不是最好的解决方案,因为它最终会导致内存泄漏
StringReader
JsonTextReader
都实现了
IDisposable
接口,因此如果未在Myore中使用它们,则必须将其丢弃。 更安全的代码是:

{"Data": {"SomeProperty": 0.00001}}
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);
        }
    }
}

带解析的字符串和属性包装。可能的重复项:您可以将值强制转换为十进制,这将返回正确的值,如果需要处理字符串值,请使用
ToString()。示例
var someProperty=((十进制)jObject[“data”][“someProperty”])