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”])我的回答也是这么说的:)谢谢。但是我指出我不能使用FloatParseHandling,这对于反序列化json很有好处,因为json只有float类型的属性或float number的字符串表示。我的json很复杂,包含嵌套对象、不同类型和数组的属性。我需要像JObject.Parse()一样对其进行反序列化,但只需要在不使用科学符号的情况下对数字进行反序列化即可@аааааааааааааааа107。应该很容易证明,升级版本号比让一个开发人员花上几个小时甚至几天的时间在他们已经在使用的工具上做的事情上更有商业意义,如果他们只想跟上升级的步伐的话,但是如果可能的话,我希望避免创建类,因为我不能保证json的确切形状。我有一个复杂的json,有许多属性、嵌套对象、数组等。SomeProperty就是一个例子。我需要正确处理所有浮点值。好的,我阅读了对OP的编辑。我现在更了解您要做的事情。您希望更改双精度的序列化方式。但是,我可以问一下为什么吗?对于任何数学目的来说,科学记数法仍然可以很好地工作。我想你只想为了显示而改变它,对吧?如果是这样的话,为什么不在进行显示之前进行转换呢?这种用法不在我的能力范围之内。我需要为第三方提供json,这是他们的要求。