【问题标题】:How to deserialize Json String into Custom DTO C# object?如何将 Json 字符串反序列化为自定义 DTO C# 对象?
【发布时间】:2016-04-15 04:52:01
【问题描述】:

我有 DTO 类。我收到了这样的 Json 序列化字符串,我该如何分配到上述 DTO 中? 我正在尝试反序列化 json 字符串,因为它对我不起作用。

RequestMetaDataXml MetaDataDTO =new RequestMetaDataXml();
                MetaDataDTO = JsonConvert.DeserializeObject<RequestMetaDataXml>(arguments["MetaDataDTO"]);

我用下面的方法生成Json

var MetaDataDTO = {
        Title:replacedtitle ,
        Expirydate: expirydate,
        AllowDownload: checkallowdownload,
        IsShare: chkAllowShare,
        IncludeMetadata: chkincludeMetadata,
        IsReel: "false",
        IsSecuredPublish: IsSecuredPublish,
        Notifications: NotificationId,
        CoverArt: { UploadedFileName: UploadedFileName },
        ProfileInfo: {
            WaterMark: {
                VideoWatermark: {
                    WaterMarkInfo: {
                        Type : WaterMarkInfoType,
                        FreeText : WaterMarkText,
                        Position: WaterMarkPosition,
                        Size: WaterMarkSize,
                        LogoId : LogoId
                    }
                }
            }
        }
    }

如何在 c# 代码中反序列化 Json 的值以及如何将这些值分配到我的自定义 DTO 中?

【问题讨论】:

    标签: c# json dto


    【解决方案1】:

    让生活更轻松,并使用库为您进行反序列化。我常用的一个推荐和我使用的是 Newtonsoft.Json,反序列化就像这样简单:

    JsonConvert.DeserializeObject<RequestMetaDataXml>(jsonStringReceived);
    

    【讨论】:

      【解决方案2】:

      您必须修改一件事,json 或 DTO 类,因为 json 有一个用于 WaterMarkVideoWatermark 等的对象,而 DTO 类说这些是 List 类型的对象。此外,您还需要一个包装类,因为 RequestMetaDataXml 被包装在另一个对象中。

      包装类:

      [DataContract]
      public class Wrapper
      {
          [DataMember(Name = "RequestMetaDataXml")]
          public RequestMetaDataXml RequestMetaDataXml { get; set; }
      }
      

      更改后您的其他课程是:

      [DataContract]
      public class RequestMetaDataXml
      {
          [DataMember(Name = "Title")]
          public string Title { get; set; }
      
          [DataMember(Name = "ExpiryDate")]
          public string ExpiryDate { get; set; }
      
          [DataMember(Name = "AllowDownload")]
          public string AllowDownload { get; set; }
      
          [DataMember(Name = "IsShare")]
          public string IsShare { get; set; }
      
          [DataMember(Name = "IncludeMetadata")]
          public string IncludeMetadata { get; set; }
      
          [DataMember(Name = "IsReel")]
          public string IsReel { get; set; }
      
          [DataMember(Name = "IsSecuredPublish")]
          public string IsSecuredPublish { get; set; }
      
          [DataMember(Name = "Notifications")]
          public NotificationId Notifications { get; set; }
      
          [DataMember(Name = "CoverArt")]
          public CoverArt Coverart { get; set; }
      
          [DataMember(Name = "ProfileInfo")]
          public ProfileInfo Profileinfo { get; set; }
      }
      
      
      [DataContract]
      public class NotificationId
      {
          [DataMember(Name = "Id")]
          public string Id { get; set; }
      
          [DataMember(Name = "Type")]
          public string Type { get; set; }
      }
      
      [DataContract]
      public class CoverArt
      {
          [DataMember(Name = "UploadedFileName")]
          public string UploadedFileName { get; set; }
      }
      
      [DataContract]
      public class ProfileInfo
      {
          [DataMember(Name = "Watermark")]
          public WaterMark WaterMark { get; set; }
      }
      
      [DataContract]
      public class WaterMark
      {
          [DataMember(Name = "VideoWatermark")]
          public VideoWatermark VideoWatermark { get; set; }
      }
      
      [DataContract]
      public class VideoWatermark
      {
          [DataMember(Name = "WaterMarkInfo")]
          public WaterMarkInfo WaterMarkInfo { get; set; }
      }
      
      [DataContract]
      public class WaterMarkInfo
      {
          [DataMember(Name = "Type")]
          public string Type { get; set; }
      
          [DataMember(Name = "FreeText")]
          public string FreeText { get; set; }
      
          [DataMember(Name = "Position")]
          public string Position { get; set; }
      
          [DataMember(Name = "Size")]
          public string Size { get; set; }
      
          [DataMember(Name = "LogoId")]
          public string LogoId { get; set; }
      }
      

      您必须添加Newtonsoft.Json 的引用,然后使用

       var wrapper = JsonConvert.DeserializeObject<Wrapper>(json);
       RequestMetaDataXml RequestMetaDataXml = wrapper.RequestMetaDataXml;
      

      如果您不想将List 更改为单个对象,则必须更新您的json 并将List 类型对象的值放在[ ] 大括号中 例如

      "Notifications": [{
              "Id": "checktest1@ssss.com",
              "Type": "ExtUser"
       }],
      

      等等。

      但无论如何你都需要Wrapper 类。

      【讨论】:

      • 但是我的通知可以来 &lt;Notifications&gt; &lt;NotificationId id="" type="" &gt;&lt;/NotificationId&gt; &lt;NotificationId id="" type="" &gt;&lt;/NotificationId&gt; &lt;/Notifications&gt; 现在只针对 ID 和类型值未分配给 DTO 我正在构建通知作为不同的对象
      • 你的json是固定结构还是动态的?
      • 我手动构建通知部分是动态的
      【解决方案3】:
              var ser = new XmlSerializer(typeof(RequestMetaDataXml));
              var settings = new XmlSerializerNamespaces();
              settings.Add("", "");
              using (var sw = new StringWriter())
              {
                  ser.Serialize(sw, o.RequestMetaDataXml, settings);
                  var t = sw.ToString();
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多