当前位置: 首页 > 知识库问答 >
问题:

Json.net只序列化某些属性

楚乐逸
2023-03-14

Json.net有没有办法只指定你想要序列化的属性?或者根据绑定标志序列化某些属性,比如只声明?

现在我正在使用< code > JObject。FromObject(MainObj。SubObj);要获取SubObj的所有属性,SubObj是遵循ISubObject接口的类的实例:

public interface ISubObject
{

}

public class ParentSubObject : ISubObject
{
    public string A { get; set; }
}


public class SubObjectWithOnlyDeclared : ParentSubObject
{
    [JsonInclude] // This is fake, but what I am wishing existed
    public string B { get; set; }

    [JsonInclude] // This is fake, but what I am wishing existed
    public string C { get; set; }
}

public class NormalSubObject: ParentSubObject
{
    public string B { get; set; }
}

如果MainObj.SubObjNormalSubObject,它将序列化A和B,但如果是SubObjectWithOnlyDeclared,它将仅序列化B和C并忽略父属性

共有3个答案

赵景曜
2023-03-14

不知道为什么@Eser选择把答案写为对你的问题的评论,而不是一个实际的答案...无论如何,他们是正确的。

[JsonIgnore] 特性应用于要忽略的任何属性。

东方和煦
2023-03-14

您可以编写如下自定义合约解决方案

public class IgnoreParentPropertiesResolver : DefaultContractResolver
{
    bool IgnoreBase = false;
    public IgnoreParentPropertiesResolver(bool ignoreBase)
    {
        IgnoreBase = ignoreBase;
    }
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var allProps = base.CreateProperties(type, memberSerialization);
        if (!IgnoreBase) return allProps;

        //Choose the properties you want to serialize/deserialize
        var props = type.GetProperties(~BindingFlags.FlattenHierarchy); 

        return allProps.Where(p => props.Any(a => a.Name == p.PropertyName)).ToList();
    }
}

现在您可以在序列化过程中使用它:

var settings = new JsonSerializerSettings() { 
                      ContractResolver = new IgnoreParentPropertiesResolver(true) 
               };
var json1 = JsonConvert.SerializeObject(new SubObjectWithOnlyDeclared(),settings );
祝花蜂
2023-03-14

而不是必须使用[JsonIgnore]在每个您不想按照另一个答案中的建议序列化的attribtue上。

如果您只想指定要序列化的属性,您可以使用[JsonObject(MemberSerialization.OptIn)][JsonProperty]属性来执行此操作,如下所示:

using Newtonsoft.Json;
...
[JsonObject(MemberSerialization.OptIn)]
public class Class1
{
    [JsonProperty]
    public string Property1 { set; get; }
    public string Property2 { set; get; }
}

这里只有<code>Property1</code>将被序列化。

 类似资料:
  • 问题内容: 我如何才能序列化一个特定的属性,但又防止其反序列化回POCO?是否可以使用属性装饰特定属性? 基本上,我正在寻找一个与ShouldSerialize *方法等效的反序列化方法。 我知道我可以编写一个自定义转换器,但是这样做似乎有点过头了。 编辑: 这里还有一些背景。这背后的原因是我的课看起来像: 我需要请求的属性,但是我不希望它反序列化并触发设置程序逻辑。 问题答案: 最简单的方法是将

  • 问题内容: 在Json.NET中,如何进行反序列化时需要的所有属性?我知道我可以使用消息中的属性来执行此操作,但是我不想这样做。主要是因为这将要求我的消息库具有外部依赖关系。 我尝试了MissingMemberHandling.Error设置,但它与我想要的相反。我对具有额外属性的JSON表示满意。当JSON中缺少任何目标对象属性时,我希望它失败。 我实际上是反序列化为F#记录,并且这些属性通常不

  • 问题内容: 我正在使用以下类型定义Json.NET属性,然后在其方法内部使用Json.NET对其进行序列化: 我的问题是,它将返回“ {}”。这是为什么?以前在工作。我所做的唯一更改是更改了OptIn而不是OptOut,因为我希望包含的属性少于保留的属性。 问题答案: 如Newtonsoft在本期中所述,Json.NET实际上支持属性。但是,当相应的“真实”成员是属性时,似乎Json.NET要求成

  • 问题内容: 可序列化属性定义为: 设置元素的属性时,它将反映在诸如的序列化查询中,并且您可以看到DOM Inspector中的更改。 当您获得元素的父节点的时,返回的html字符串将包含所有可序列化的属性,作为其对应的属性 我制作了一个页面,看起来好像它已经可靠地打印了Chrome和Firefox 中该元素的所有可序列化属性的表://jsfiddle.net/tEVLp/16/。自定义属性从不可序

  • 考虑: 如果我们序列化Foo(),输出是: 我想要: 最干净的方法是什么?

  • 问题内容: 我正在使用JsonConvert.SerializeObject序列化模型对象。服务器希望所有字段都为字符串。我的模型对象具有数字属性和字符串属性。我无法将属性添加到模型对象。有没有一种方法可以将所有属性值序列化为字符串?我必须仅支持序列化,而不支持反序列化。 问题答案: 您甚至可以为数字类型提供自己的数字。我只是想这和它的作品- 它的快速和肮脏的,你几乎肯定希望把它扩大到支持其他数字