Json序列化程序具有动态和小数的奇怪行为
本文关键字:小数 程序 序列化 动态 Json | 更新日期: 2023-09-27 18:25:57
我正在尝试将包含小数的动态结构转换为具体类。我还没有找到一个合理的解决方案,所以我使用了"hacky"方法,将动态结构序列化为JSON,然后将其反序列化为具体的类。我的第一个问题是——有更好的方法吗?
事实上,我注意到了一些非常奇怪的事情。在完成我刚才解释的操作后,我试图从这些十进制值中获取字符串值-a.ToString(CultureInfo.InvariantCulture);
令我惊讶的是,那些弦是不同的!一个是CCD_ 2,另一个为CCD_。你能解释一下为什么会发生这种情况吗?在调试过程中,两者的价值似乎是相同的。。。
这是我的代码,所以你可以很容易地检查这个:
using System.Globalization;
using Newtonsoft.Json;
using NUnit.Framework;
namespace SimpleFx.UnitTests.UnitTest
{
public class DecimalStruct
{
public DecimalStruct(decimal a)
{
A = a;
}
public decimal A { get; set; }
}
public class DynamicDecimalTest
{
/// <summary>
/// "Hacky" way of casting dynamic object to a concrete class
/// </summary>
public static T Convert<T>(dynamic obj) where T : class
{
var serialized = JsonConvert.SerializeObject(obj);
return JsonConvert.DeserializeObject<T>(serialized);
}
[Test]
public void CastTest()
{
decimal a = 10;
dynamic s1 = new DecimalStruct(a);
var s2 = Convert<DecimalStruct>(s1);
Assert.AreEqual(a, s1.A);
Assert.AreEqual(a, s2.A);
Assert.AreEqual(a.ToString(CultureInfo.InvariantCulture), s1.A.ToString(CultureInfo.InvariantCulture));
Assert.AreEqual(a.ToString(CultureInfo.InvariantCulture), s2.A.ToString(CultureInfo.InvariantCulture)); // this fails because "10.0" is not equal "10"
}
}
}
请考虑以下示例将动态转换为具体
var typeName = "YourNamespace.ExampleObj";
object obj = new
{
A = 5,
B = "xx"
};
var props = TypeDescriptor.GetProperties(obj);
Type type = Type.GetType(typeName);
ExampleObj instance = (ExampleObj)Activator.CreateInstance(type);
instance.A = (int)props["A"].GetValue(obj);
instance.B = (string)props["B"].GetValue(obj);
//serialize the instance now...