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"
        }
    }
}

Json序列化程序具有动态和小数的奇怪行为

请考虑以下示例将动态转换为具体

    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...