首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# .Net Newtonsoft JSON不序列化属性,而是在Json中阅读它

C# .Net Newtonsoft JSON不序列化属性,而是在Json中阅读它
EN

Stack Overflow用户
提问于 2018-07-04 03:06:16
回答 1查看 396关注 0票数 2

使用.Net和Newtonsoft,我如何在序列化时隐藏一个模型属性,但是,能够填充该属性并利用传递的值。

例如。

代码语言:javascript
复制
[JsonIgnore]
public Int16 Value { get; set; }

这隐藏了输出上的属性,但是,我不能设置模型POST的值。如何在输出时隐藏属性,但允许在POST或PUT请求上设置属性?

帖子示例:

代码语言:javascript
复制
{
    "Name": "King James Version",
    "Abbreviation" : "kjv",
    "Publisher": "Public Domain",
    "Copyright": "This is the copyright",
    "Notes": "This is the notes.",
    "TextDirection" : "LTR"
}

举个例子:

代码语言:javascript
复制
{
    "ID" : 1,
    "Name": "King James Version",
    "Abbreviation" : "kjv",
    "Publisher": "Public Domain",
    "Copyright": "This is the copyright",
    "Notes": "This is the notes.",
    "TextDirection" : "LTR"
}

商业逻辑:

  1. ID不应在POST请求中传递,如果被传递,则将被忽略。
  2. POST请求需要缩写,并将使用自定义验证筛选器属性对数据库进行验证。
  3. 不能根据PUT请求传递缩写,因为该字段/属性无法更新。
  4. 必须在PUT请求中将ID传递给自定义验证器中的标识,确认它是PUT请求而不是POST请求。

型号:

代码语言:javascript
复制
namespace Library.Models.Bible
{
    public class BibleModel : IPopulatable<BibleModel, DataTable>, IPopulatable<BibleModel, DataRow>
    {
        public Int32? ID { get; set; }
    [MinLength(4, ErrorMessage = "Bible name must be between 4-100 characters")]
    [MaxLength(100, ErrorMessage = "Bible name must be between 4-100 characters")]
    public String Name { get; set; }

    [MinLength(3, ErrorMessage = "Bible abbreviation must be between 3-9 characters")]
    [MaxLength(9, ErrorMessage = "Bible abbreviation must be between 3-9 characters")]
    [ValidateBibleAbbreviationExists]
    public String Abbreviation { get; set; }

    [MaxLength(250, ErrorMessage = "Publisher may not exceed 250 characters")]
    public String Publisher { get; set; }

    [MaxLength(3000, ErrorMessage = "Copyright may not exceed 3000 characters")]
    public String Copyright { get; set; }

    [MaxLength(3000, ErrorMessage = "Notes may not exceed 3000 characters")]
    public String Notes { get; set; }

    [EnumDataType(typeof(Enums.eTxtDir), ErrorMessage = "Text direction does not exist. Allowed values: LTR, RTL")]
    public String TextDirection { get; set; }

    [JsonIgnore]
    public Int16 Active { get; set; } = 1;

    public BibleModel Populate(DataTable dT)
    {
        if (dT != null && dT.Rows.Count > 0)
            return Populate(dT.Rows[0]);
        return null;
    }

    public BibleModel Populate(DataRow ro)
    {
        if(ro != null)
        {
            this.ID = Convert.ToInt32(ro["Bible_ID"]);
            this.Name = ro["Name"].ToString();
            this.Abbreviation = ro["Abbr"].ToString();
            this.Publisher = ro["Publisher"].ToString();
            this.Copyright = ro["Copyright"].ToString();
            this.Notes = ro["Notes"].ToString();
            this.TextDirection = ro["TxtDir"].ToString();
            return this;
        }
        return null;
    }        
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-04 07:55:19

有几种可能性(https://www.newtonsoft.com/json/help/html/ConditionalProperties.htm)

1)编写自定义合同解析器

代码语言:javascript
复制
class MyContractResolver: DefaultContractResolver 
{


  protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            JsonProperty property = base.CreateProperty(member, memberSerialization);
            property.ShouldSerialize = String.Compare(property.PropertyName, "Value") != 0;
            return property;
        }
}

2)向类中添加ShouldSerialize...方法

代码语言:javascript
复制
 class MyClass {

     public Int16 Value {get;set;}
     public bool ShouldSerializeValue() {return false;}
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51165216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档