JSON.Net:强制序列化所有私有字段和子类中的所有字段

Jef*_*ito 46 c# json.net

我有一个有几个不同类的类,我将这些类中的信息发送给客户,但我不想将它们全部发送出去,所以有些是私有的,有些是[JsonObject(MemberSerialization.OptIn)]旗帜等.

但是,现在我想在需要关闭服务器时每隔12个小时(我不想使用数据库)对所有这些对象进行备份,所以我想做的(如果可能的话)是强制JSON .Net Serializer转换对象和属于该对象的所有对象.

例如:

class Foo
{
  public int Number;
  private string name;
  private PrivateObject po = new PrivateObject();

  public string ToJSON()
  { /* Serialize my public field, my property and the object PrivateObject */ }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了这段代码(即使它已经过时了)但它没有序列化与我的对象相关的对象:

Newtonsoft.Json.JsonSerializerSettings jss = new Newtonsoft.Json.JsonSerializerSettings();

Newtonsoft.Json.Serialization.DefaultContractResolver dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver();
dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic;
jss.ContractResolver = dcr;

return Newtonsoft.Json.JsonConvert.SerializeObject(this, jss);
Run Code Online (Sandbox Code Playgroud)

L.B*_*L.B 58

这应该工作:

var settings = new JsonSerializerSettings() { ContractResolver = new MyContractResolver() };
var json = JsonConvert.SerializeObject(obj, settings);
Run Code Online (Sandbox Code Playgroud)
public class MyContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var props = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                        .Select(p => base.CreateProperty(p, memberSerialization))
                    .Union(type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                               .Select(f => base.CreateProperty(f, memberSerialization)))
                    .ToList();
        props.ForEach(p => { p.Writable = true; p.Readable = true; });
        return props;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能需要检查类型参数(取决于您要序列化的对象的复杂性).当JSON.NET试图找到错误类型的某些字段时,我有例外. (2认同)

Ada*_*dam 5

@ LB的答案很棒.但是......它需要.NET 3.5或更高版本.

对于我们这些坚持2.0的人......

public class ForceJSONSerializePrivatesResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
    protected override IList<Newtonsoft.Json.Serialization.JsonProperty> CreateProperties(System.Type type, MemberSerialization memberSerialization)
    {
        var props = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

        List<Newtonsoft.Json.Serialization.JsonProperty> jsonProps = new List<Newtonsoft.Json.Serialization.JsonProperty>();

        foreach( var prop in props )
        {
        jsonProps.Add( base.CreateProperty(prop, memberSerialization));
        }

        foreach( var field in type.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) )
        {
        jsonProps.Add ( base.CreateProperty( field, memberSerialization ) );
        }

        jsonProps.ForEach(p => { p.Writable = true; p.Readable = true; });
        return jsonProps;
    }
}
Run Code Online (Sandbox Code Playgroud)

......似乎有效.

  • 我不记得了..Net 2.0是否支持`lamba expr`(*`jsonProps.ForEach(p => {p.Writable = true; p.Readable = true;});`*),是否在2.0中提供了"ForEach"? (2认同)