Newtonsoft JSON序列化动态属性返回到相应的t类型

发布于 2025-02-07 22:11:38 字数 3446 浏览 0 评论 0原文

我有一个正在转换为JSON字符串并保存的课程。该类包含2个动态属性,这些属性是T型T。现在,当我进行挑选并恢复对象时,它将JSON字符串分配给该动态属性。是否有一种方法可以指定将动态属性序列化回LDRENTITY而不是JSON字符串。

这是我的类(请参阅LDRreagententity和bcireagententity属性):

using Domain.Model.Shared.Entity.Panel;
using System.Collections.Generic;

namespace Authoring.DataAccess.DataModel
{
    /// <summary>
    /// Cocktail reagent structure to coordinate data.
    /// </summary>
    public class CocktailReagent
    {
        /// <summary>
        /// Id.
        /// </summary>
        public string Id { get; set; }

        /// <summary>
        /// Reagent type.
        /// </summary>
        public ReagentType Type { get; set; }

        /// <summary>
        /// Reagent name.
        /// </summary>
        public string ActualName { get; set; }

        /// <summary>
        /// Reagent name.
        /// </summary>
        public int Version { get; set; }

        /// <summary>
        /// Stability days.
        /// </summary>
        public int StabilityDays { get; set; }

        /// <summary>
        /// Number of tests.
        /// </summary>
        public int NumberOfTests { get; set; }

        /// <summary>
        /// Reagent comments.
        /// </summary>
        public string Comments { get; set; }

        /// <summary>
        /// Cocktail reagent Items.
        /// </summary>
        public List<CocktailReagentItem> SelectedReagents { get; set; }
    }

    public class CocktailReagentItem
    {
        public string Id { get; set; }

        public uint Index { get; set; }

        public uint Volume { get; set; }

        public dynamic LdrReagentEntity { get; set; } //The original type is LdrEntity

        public dynamic BciReagentEntity { get; set; } //The original type is LdrEntity
    }
}

转换后的两个动态属性是类型的ldrentity。

因此,当我转换为JSON字符串时,我会执行以下操作。

    public class LdrExportObj
            {
                public List<CocktailReagent> CocktailReagents { get; set; }
                public string HashCode { get; set; }
            }
    
    public void Export()
    {
    var exportObj = new LdrExportObj
                    {
                        CocktailReagents = listOfCocktailReagents, //These are the list of items I am saving
                        HashCode = HashCodeHelper.GenerateHashCode(str),
                    };
    
                    var exportStr = JsonConvert.SerializeObject(exportObj, Formatting.Indented); //I get the json string and save it.

//Save to file
    
    }

当我导入时,我说

   public void Import()
    {
    var obj = JsonConvert.DeserializeObject<LdrExportObj>(str);
         
                    var cocktailsStr = JsonConvert.SerializeObject(obj.CocktailReagents, Formatting.Indented); //If I expand the object and see the dynamic properties, its a json string.
return new LdrExportObj()
                {
                    CocktailReagents = obj.CocktailReagents,
                    HashCode = obj.HashCode,
                };
    }

何时调试时,它不会序列化内部JSON字符串回到LDRENTITY,而是将JSON字符串分配给动态属性,而是请参见屏幕截图中的BcireAgententity属性。我希望它可以说服回到原始的LDRENTITY类型。

I have a class that I am converting into a JSON string and saving. The class contains 2 dynamic properties which are of some type T. In my case its LdrEntity. Now when I am deserializing and getting the object back, it is assigning a JSON string to that dynamic property. Is there a way to specify to serialize the dynamic property back to LdrEntity instead of the JSON string.

Here is my class (see LdrReagentEntity and BciReagentEntity properties):

using Domain.Model.Shared.Entity.Panel;
using System.Collections.Generic;

namespace Authoring.DataAccess.DataModel
{
    /// <summary>
    /// Cocktail reagent structure to coordinate data.
    /// </summary>
    public class CocktailReagent
    {
        /// <summary>
        /// Id.
        /// </summary>
        public string Id { get; set; }

        /// <summary>
        /// Reagent type.
        /// </summary>
        public ReagentType Type { get; set; }

        /// <summary>
        /// Reagent name.
        /// </summary>
        public string ActualName { get; set; }

        /// <summary>
        /// Reagent name.
        /// </summary>
        public int Version { get; set; }

        /// <summary>
        /// Stability days.
        /// </summary>
        public int StabilityDays { get; set; }

        /// <summary>
        /// Number of tests.
        /// </summary>
        public int NumberOfTests { get; set; }

        /// <summary>
        /// Reagent comments.
        /// </summary>
        public string Comments { get; set; }

        /// <summary>
        /// Cocktail reagent Items.
        /// </summary>
        public List<CocktailReagentItem> SelectedReagents { get; set; }
    }

    public class CocktailReagentItem
    {
        public string Id { get; set; }

        public uint Index { get; set; }

        public uint Volume { get; set; }

        public dynamic LdrReagentEntity { get; set; } //The original type is LdrEntity

        public dynamic BciReagentEntity { get; set; } //The original type is LdrEntity
    }
}

The two dynamic properties when converted are of type LdrEntity.

So when I convert to json string, I do the following.

    public class LdrExportObj
            {
                public List<CocktailReagent> CocktailReagents { get; set; }
                public string HashCode { get; set; }
            }
    
    public void Export()
    {
    var exportObj = new LdrExportObj
                    {
                        CocktailReagents = listOfCocktailReagents, //These are the list of items I am saving
                        HashCode = HashCodeHelper.GenerateHashCode(str),
                    };
    
                    var exportStr = JsonConvert.SerializeObject(exportObj, Formatting.Indented); //I get the json string and save it.

//Save to file
    
    }

When I Import I say

   public void Import()
    {
    var obj = JsonConvert.DeserializeObject<LdrExportObj>(str);
         
                    var cocktailsStr = JsonConvert.SerializeObject(obj.CocktailReagents, Formatting.Indented); //If I expand the object and see the dynamic properties, its a json string.
return new LdrExportObj()
                {
                    CocktailReagents = obj.CocktailReagents,
                    HashCode = obj.HashCode,
                };
    }

When I debug, its not serializing the internal json string back to LdrEntity, instead its assigning a json string to the dynamic property, See the BciReagentEntity Property in the screenshot. I want it to be conveted back to the original LdrEntity type.

dynamic property is json string

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文