2016-04-15 2 views
1

Ich habe DTO KlassenWie JSON-String in benutzerdefiniertes DTO C# -Objekt deserialisieren?

[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 List<NotificationId> Notifications { get; set; } 

     [DataMember(Name = "CoverArt")] 
     public List<CoverArt> Coverart { get; set; } 

     [DataMember(Name = "ProfileInfo")] 
     public List<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 List<WaterMark> WaterMark { get; set; } 
    } 

    [DataContract] 
    public class WaterMark 
    { 
     [DataMember(Name = "VideoWatermark")] 
     public List<VideoWatermark> VideoWatermark { get; set; } 
    } 

    [DataContract] 
    public class VideoWatermark 
    { 
     [DataMember(Name = "WaterMarkInfo")] 
     public List<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; } 
    } 

ich Json String wie

"{\"RequestMetaDataXml\":{ 
          \"Title\":\"TestCheck27\", 
          \"AllowDownload\":true, 
          \"IsShare\":true, 
          \"IncludeMetadata\":true, 
          \"IsReel\":\"false\", 
          \"IsSecuredPublish\":\"true\", 
          \"Notifications\":{ 
               \"Id\":\"[email protected]\", 
               \"Type\":\"ExtUser\"}, 
          \"CoverArt\":{ 
              \"UploadedFileName\":\"\"}, 
          \"ProfileInfo\":{ 
              \"WaterMark\":{ 
                  \"VideoWatermark\":{ 
                    \"WaterMarkInfo\":{ 
                         \"Type\":\"None\", 
                         \"FreeText\":\"\", 
                         \"Position\": 
                         \"MiddleCenter\", 
                         \"Size\":\"Medium\", 
                         \"LogoId\":\"7\" 
                         } 
                       } 
                  } 
              } 
         } 
}" 

ich erhalten habe Json serialisiert Zeichenfolge wie diese haben, wie kann ich in den Above DTO zuweisen? Ich versuche, den JSON-String so zu deserialisieren, dass er für mich nicht funktioniert.

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

ich bin generatig Json in dem folgenden Verfahren

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

, wie die Werte von Json in C# -Code deserialisieren und wie diese Werte in meinen benutzerdefinierten DTO zuweisen? Machen Sie Ihr Leben

Ich habe Gefällt Ihnen dieses

<Title></Title> 
    <ExpiryDate> </ExpiryDate> 
    <AllowDownload> </AllowDownload> 
    <IsShare> </IsShare> 
    <IncludeMetadata> </IncludeMetadata> 
    <IsReel> </IsReel> 
    <IsSecuredPublish> </IsSecuredPublish> 
    <Notifications> 
     <NotificationId id= type= ></NotificationId> 
    </Notifications> 
    <CoverArt> 
     <UploadedFileName> </UploadedFileName> 
    </CoverArt> 
    <ProfileInfo> 
     <Watermark> 
      <VideoWatermark> 
       <WaterMarkInfo> 
        <Type> </Type> 
        <FreeText></FreeText> 
        <Position></Position> 
        <Size></Size> 
        <LogoId></LogoId> 
       </WaterMarkInfo> 
      </VideoWatermark> 
     </Watermark> 
    </ProfileInfo> 

Antwort

0

wie XML-Daten zu bauen einfacher und eine Bibliothek verwenden, um die Deserialisation für Sie zu tun. Ein häufig empfohlen und die ich benutze, ist Newtonsoft.Json, ist Deserialisation so einfach wie diese:

JsonConvert.DeserializeObject<RequestMetaDataXml>(jsonStringReceived); 
+0

Ich versuchte, dass es auch nicht funktioniert hat. – selvakumar

0

Sie haben eine Sache zu ändern, entweder json oder DTO-Klasse, weil json ein einzelnes Objekt für WaterMark hat, VideoWatermark etc Während die DTO-Klasse sagt, dass dies List Typ-Objekte sind. Außerdem benötigen Sie eine Wrapperklasse, da RequestMetaDataXml in ein anderes Objekt eingebettet ist.

Wrapper-Klasse:

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

und Ihre anderen Klassen nach Änderungen sind:

[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; } 
} 

Sie haben einen Verweis von Newtonsoft.Json und dann

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

verwenden hinzufügen Wenn Sie wollen nicht List zu einzelnen Objekten ändern, müssen Sie Ihre aktualisieren json und put Werte für List Art Objekte Werte in [ ] Klammern z.

"Notifications": [{ 
     "Id": "[email protected]", 
     "Type": "ExtUser" 
}], 

und so weiter.

Aber Sie brauchen diese Klasse Wrapper sowieso.

+0

Aber meine Benachrichtigung kann kommen Jetzt nur für die ID und Typ Wert ist nicht zu DTO zuweisen Ich bin Building Notification als ein anderes Objekt – selvakumar

+0

Ist Ihr JSON feste Struktur oder dynamische? –

+0

Ich baue Manuell, dass der Benachrichtigungsteil allein Dynamic One ist – selvakumar

0
 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(); 
     } 
Verwandte Themen