2016-10-27 9 views
1

私の質問はかなり簡単です。 私はAPIに取り組んでおり、エンティティを更新する必要があります。この目的のために、bodyから来るJObjectをKenticoモデルのTreeNode(News)オブジェクトに変換する必要があります。 Kentico:Jsonのオブジェクト(TreeNode)をデシリアライズ

Kenticoのドキュメントを読む

は、右のようです JSonSerializerと呼ばれるオブジェクトがある1:

[HttpPut] 
[Route("")] 
public IHttpActionResult UpdateById([FromBody]JObject updated) 
{ 
    CMS.DataCom.JsonSerializer serializer = new CMS.DataCom.JsonSerializer(); 
    var result = serializer.Unserialize<CMS.DocumentEngine.Types.News>(updated.ToString()); 

    DocumentHelper.UpdateDocument(result); 

    return Ok("record updated."); 
} 

私の "更新" 対象:

Kentico 9 JsonSerializer

私のAPIは、このようになります正しいJSONを持っています。私はアンシリアライズしようとすると、しかし、私は次のエラーを取得する:

enter image description here

An exception of type 'System.Runtime.Serialization.InvalidDataContractException' occurred in System.Runtime.Serialization.dll but was not handled in user code Additional information: Type 'CMS.DocumentEngine.Types.News' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute. See the Microsoft .NET Framework documentation for other supported types.

マイ自動生成CMS.DocumentEngine.Types.Newsクラスは、このように定義されています

//-------------------------------------------------------------------------------------------------- 
// <auto-generated> 
// 
//  This code was generated by code generator tool. 
// 
//  To customize the code use your own partial class. For more info about how to use and customize 
//  the generated code see the documentation at http://docs.kentico.com. 
// 
// </auto-generated> 
//-------------------------------------------------------------------------------------------------- 

using System; 
using System.Collections.Generic; 

using CMS; 
using CMS.Helpers; 
using CMS.DataEngine; 
using CMS.DocumentEngine.Types; 
using CMS.DocumentEngine; 
using System.Runtime.Serialization; 

[assembly: RegisterDocumentType(News.CLASS_NAME, typeof(News))] 
namespace CMS.DocumentEngine.Types 
{ 
    /// <summary> 
    /// Represents a content item of type News. 
    /// </summary> 
    public partial class News : TreeNode 
    { 
     #region "Constants and variables" 

     /// <summary> 
     /// The name of the data class. 
     /// </summary> 
     public const string CLASS_NAME = "AonAffinity.News"; 


     /// <summary> 
     /// The instance of the class that provides extended API for working with News fields. 
     /// </summary> 
     private readonly NewsFields mFields; 

     #endregion 


     #region "Properties" 

     /// <summary> 
     /// 
     /// </summary> 
     [DatabaseIDField] 
     public int NewsID 
     { 
      get 
      { 
       return ValidationHelper.GetInteger(GetValue("NewsID"), 0); 
      } 
      set 
      { 
       SetValue("NewsID", value); 
      } 
     } 


     /// <summary> 
     /// Hero Image (1650x660). 
     /// </summary> 
     [DatabaseField] 
     public string HeroImage 
     { 
      get 
      { 
       return ValidationHelper.GetString(GetValue("HeroImage"), ""); 
      } 
      set 
      { 
       SetValue("HeroImage", value); 
      } 
     } 


     /// <summary> 
     /// Heading Text. 
     /// </summary> 
     [DatabaseField] 
     public string HeadingText 
     { 
      get 
      { 
       return ValidationHelper.GetString(GetValue("HeadingText"), ""); 
      } 
      set 
      { 
       SetValue("HeadingText", value); 
      } 
     } 


     /// <summary> 
     /// Main Content. 
     /// </summary> 
     [DatabaseField] 
     public string MainContent 
     { 
      get 
      { 
       return ValidationHelper.GetString(GetValue("MainContent"), ""); 
      } 
      set 
      { 
       SetValue("MainContent", value); 
      } 
     } 


     /// <summary> 
     /// News Title. 
     /// </summary> 
     [DatabaseField] 
     public string NewsTitle 
     { 
      get 
      { 
       return ValidationHelper.GetString(GetValue("NewsTitle"), ""); 
      } 
      set 
      { 
       SetValue("NewsTitle", value); 
      } 
     } 


     /// <summary> 
     /// Release Date. 
     /// </summary> 
     [DatabaseField] 
     public DateTime NewsReleaseDate 
     { 
      get 
      { 
       return ValidationHelper.GetDateTime(GetValue("NewsReleaseDate"), DateTimeHelper.ZERO_TIME); 
      } 
      set 
      { 
       SetValue("NewsReleaseDate", value); 
      } 
     } 


     /// <summary> 
     /// News Summary. 
     /// </summary> 
     [DatabaseField] 
     public string NewsSummary 
     { 
      get 
      { 
       return ValidationHelper.GetString(GetValue("NewsSummary"), ""); 
      } 
      set 
      { 
       SetValue("NewsSummary", value); 
      } 
     } 


     /// <summary> 
     /// News Text. 
     /// </summary> 
     [DatabaseField] 
     public string NewsText 
     { 
      get 
      { 
       return ValidationHelper.GetString(GetValue("NewsText"), ""); 
      } 
      set 
      { 
       SetValue("NewsText", value); 
      } 
     } 


     /// <summary> 
     /// Teaser Image (370x230). 
     /// </summary> 
     [DatabaseField] 
     public string NewsTeaser 
     { 
      get 
      { 
       return ValidationHelper.GetString(GetValue("NewsTeaser"), ""); 
      } 
      set 
      { 
       SetValue("NewsTeaser", value); 
      } 
     } 


     /// <summary> 
     /// This text will show up on the search results page. It has a max length of . 
     /// </summary> 
     [DatabaseField] 
     public string SearchDescriptionText 
     { 
      get 
      { 
       return ValidationHelper.GetString(GetValue("SearchDescriptionText"), ""); 
      } 
      set 
      { 
       SetValue("SearchDescriptionText", value); 
      } 
     } 


     /// <summary> 
     /// Page Container Css Class Override. 
     /// </summary> 
     [DatabaseField] 
     public string PageContainerCssClassOverride 
     { 
      get 
      { 
       return ValidationHelper.GetString(GetValue("PageContainerCssClassOverride"), ""); 
      } 
      set 
      { 
       SetValue("PageContainerCssClassOverride", value); 
      } 
     } 


     /// <summary> 
     /// Gets an object that provides extended API for working with News fields. 
     /// </summary> 
     public NewsFields Fields 
     { 
      get 
      { 
       return mFields; 
      } 
     } 


     /// <summary> 
     /// Provides extended API for working with News fields. 
     /// </summary> 
     public partial class NewsFields 
     { 
      /// <summary> 
      /// The content item of type News that is a target of the extended API. 
      /// </summary> 
      private readonly News mInstance; 


      /// <summary> 
      /// Initializes a new instance of the <see cref="NewsFields" /> class with the specified content item of type News. 
      /// </summary> 
      /// <param name="instance">The content item of type News that is a target of the extended API.</param> 
      public NewsFields(News instance) 
      { 
       mInstance = instance; 
      } 


      /// <summary> 
      /// 
      /// </summary> 
      public int ID 
      { 
       get 
       { 
        return mInstance.NewsID; 
       } 
       set 
       { 
        mInstance.NewsID = value; 
       } 
      } 


      /// <summary> 
      /// Hero Image (1650x660). 
      /// </summary> 
      public string HeroImage 
      { 
       get 
       { 
        return mInstance.HeroImage; 
       } 
       set 
       { 
        mInstance.HeroImage = value; 
       } 
      } 


      /// <summary> 
      /// Heading Text. 
      /// </summary> 
      public string HeadingText 
      { 
       get 
       { 
        return mInstance.HeadingText; 
       } 
       set 
       { 
        mInstance.HeadingText = value; 
       } 
      } 


      /// <summary> 
      /// Main Content. 
      /// </summary> 
      public string MainContent 
      { 
       get 
       { 
        return mInstance.MainContent; 
       } 
       set 
       { 
        mInstance.MainContent = value; 
       } 
      } 


      /// <summary> 
      /// News Title. 
      /// </summary> 
      public string Title 
      { 
       get 
       { 
        return mInstance.NewsTitle; 
       } 
       set 
       { 
        mInstance.NewsTitle = value; 
       } 
      } 


      /// <summary> 
      /// Release Date. 
      /// </summary> 
      public DateTime ReleaseDate 
      { 
       get 
       { 
        return mInstance.NewsReleaseDate; 
       } 
       set 
       { 
        mInstance.NewsReleaseDate = value; 
       } 
      } 


      /// <summary> 
      /// News Summary. 
      /// </summary> 
      public string Summary 
      { 
       get 
       { 
        return mInstance.NewsSummary; 
       } 
       set 
       { 
        mInstance.NewsSummary = value; 
       } 
      } 


      /// <summary> 
      /// News Text. 
      /// </summary> 
      public string Text 
      { 
       get 
       { 
        return mInstance.NewsText; 
       } 
       set 
       { 
        mInstance.NewsText = value; 
       } 
      } 


      /// <summary> 
      /// Teaser Image (370x230). 
      /// </summary> 
      public string Teaser 
      { 
       get 
       { 
        return mInstance.NewsTeaser; 
       } 
       set 
       { 
        mInstance.NewsTeaser = value; 
       } 
      } 


      /// <summary> 
      /// This text will show up on the search results page. It has a max length of . 
      /// </summary> 
      public string SearchDescriptionText 
      { 
       get 
       { 
        return mInstance.SearchDescriptionText; 
       } 
       set 
       { 
        mInstance.SearchDescriptionText = value; 
       } 
      } 


      /// <summary> 
      /// Page Container Css Class Override. 
      /// </summary> 
      public string PageContainerCssClassOverride 
      { 
       get 
       { 
        return mInstance.PageContainerCssClassOverride; 
       } 
       set 
       { 
        mInstance.PageContainerCssClassOverride = value; 
       } 
      } 
     } 

     #endregion 


     #region "Constructors" 

     /// <summary> 
     /// Initializes a new instance of the <see cref="News" /> class. 
     /// </summary> 
     public News() : base(CLASS_NAME) 
     { 
      mFields = new NewsFields(this); 
     } 

     #endregion 
    } 
} 

にです私がすでにデシリアライズしようとしたことに言及することも重要です。System.Web.Script.Serialization.JavaScriptSerializerおよびNewtonsoft.Json.Linq.JToken.ToObjectと、APIのパラメータにクラスを直接置くことによっても動作しませんでした。

どのような考えですか?

答えて

2

コントローラに送信するjsonオブジェクトと同じプロパティを含むDTOオブジェクトを作成することをお勧めします。今

[HttpPut] 
[Route("")] 
public IHttpActionResult UpdateById([FromBody]PersonDTO updated) 
{...} 

、あなたがマップすることができメソッド内:JSONオブジェクトはDTOクラスは

public class PersonDTO 
{ 
    public string Name {get; set;} 
    public int Age {get; set; } 
} 

が所定の位置にあなたは、APIメソッドは次のようになり、これを持つとされるよりも

{name: 'Roman', age: 29} 

ある場合それはあなたが必要とするものに。

このアプローチでは、Web APIがすべてのシリアライズ/デシリアライズを処理します。

+0

これは私が最後にしたものです。すべてのプロパティをTreeNodeオブジェクトにマップするためにDTOを作成しました。ありがとう!! –

0

クラスNewsは、シリアライズできないいくつかのフィールド(これらのフィールドは複雑です)を持つTreeNodeクラスから継承されました。 Romanが言ったように、必要なフィールドだけを含むオブジェクトのモデルを作成する方が良いです。

関連する問題