Json.NET - 如何在不访问类的情况下从序列化中排除属性

时间:2017-02-09 09:57:46

标签: c# .net json json.net

我正在尝试使用Json.NET序列化一个类。这就是我现在所做的。

<table class="table">
    <thead>
        <tr>
            <th>S.No.</th>
            <th>Name</th>
            <th>Amount</th>
        </tr>
    </thead>
    <tbody>
    <% Data.where(:from_user => current_user.id).each_with_index do |tc, index| %>
      <% begin %>
        <tr>
            <td><%=index+1%></td>
            <td><%=User.find(tc.to_user).full_name%></td>
            <td><%=tc.amount%></td>
        </tr>
      <% rescue %>
      <% next %>
      <% end %>
    <% end %>
  </tbody>
</table>

我无法访问public class AClass { // I don't have access to BClass public BClass b; } AClass a = new AClass(); JsonConvert.SerializeObject(a); 。我想序列化BClass,但我不想序列化AClass的所有属性,只有其中一些属性。

我该怎么做?

3 个答案:

答案 0 :(得分:7)

您可以使用自定义ContractResolverthis library可以更轻松地构建。

var propertiesContractResolver = new PropertiesContractResolver();
propertiesContractResolver.ExcludeProperties.Add("BClass.Id");
var serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = propertiesContractResolver;
JsonConvert.SerializeObject(a, serializerSettings);

答案 1 :(得分:4)

您可以在IContractResolver课程的帮助下完成此任务。

查看文档http://www.newtonsoft.com/json/help/html/ConditionalProperties.htm

答案 2 :(得分:1)

您可以选择一些想法,您可以根据需要执行此操作的不同类别以及您需要算法的性能来选择:

可能最快的方法是使用Json.net的 custom converters Contract Resolvers 并构建一个适合您的需求,即忽略属性不想包括在内。

另一种方法是将此类映射到另一个类似定义的类,该类不包含您不想包含的属性,然后序列化该类。您可以使用 AutoMapper 在类似定义的类之间快速映射。

最后,您可以创建ExpandoObject(甚至是Dictionary<string, object>)并将要包含的属性添加到Expando或Dictionary中(并且可以复制这些属性/键值对手动或通过反射等)然后序列化该对象/字典。