C# 将JsonSerializerSettings中的null更改为空

C# 将JsonSerializerSettings中的null更改为空,c#,json,asp.net-mvc,serialization,C#,Json,Asp.net Mvc,Serialization,在我的asp.NETMVC项目中,我使用azure缓存作为缓存提供程序 我使用这个方法用JsonSerializerSettings序列化我的数据 public static JsonSerializerSettings GetDefaultSettings() { JsonSerializerSettings settings = new JsonSerializerSettings { TypeN

在我的asp.NETMVC项目中,我使用azure缓存作为缓存提供程序 我使用这个方法用JsonSerializerSettings序列化我的数据

public static JsonSerializerSettings GetDefaultSettings()
        {
            JsonSerializerSettings settings = new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.All,
                TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple,
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
                NullValueHandling = NullValueHandling.Ignore,
                Binder = new TypeManagerSerializationBinder(),
                ContractResolver = new PrivateSetterContractResolver()
            };
            settings.Converters.Add(new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.RoundtripKind });
            return settings;
        }
我的目标是这样的

{
   "Name": "Bad Boys III",
   "Description": "It's no Bad Boys",
   "Classification": null,
   "Studio": null,
   "ReleaseCountries": null
 }
一切都正常,但我想返回“{}”,而不是null列的null

{
   "Name": "Bad Boys III",
   "Description": "It's no Bad Boys",
   "Classification": {},
   "Studio": {},
   "ReleaseCountries": {}
 }

是否有任何配置可以为我执行此操作?

您需要调整自定义ContractResolver。它可能看起来像这样(我没有测试它):

JsonSerializerSettings设置=新的JsonSerializerSettings
{
...
ContractResolver=新的MyCustomContractResolver()
};
公共类MyCustomContractResolver:Newtonsoft.Json.Serialization.DefaultContractResolver
{
受保护的重写IList CreateProperties(类型类型,MemberSerialization MemberSerialization)
{
返回类型.GetProperties().Select(p=>
{
var property=base.CreateProperty(p,memberSerialization);
property.ValueProvider=新的MyCustomNullValueProvider(p);
归还财产;
}).ToList();
}
}
公共类MyCustomNullValueProvider:IValueProvider
{
PropertyInfo_MemberInfo;
公共MyCustomNullValueProvider(PropertyInfo memberInfo)
{
_MemberInfo=MemberInfo;
}
公共对象GetValue(对象目标)
{
对象值=\u MemberInfo.GetValue(目标);
如果(值==null)
结果=“{}”;
其他的
返回值;
}
public void SetValue(对象目标、对象值)
{
如果((字符串)值==“{}”)
值=空;
_MemberInfo.SetValue(目标,值);
}
}

也可以看到这个答案:

stringjson=jsonstring.Replace(“null”,“{}”);我正在使用此方法反序列化公共对象反序列化(Stream){JsonSerializer serializer=JsonSerializer.Create(this.Settings);JsonReader=new JsonTextReader(new StreamReader(Stream,Encoding.UTF8));返回serializer.deserialize(reader);}不确定,但你可以尝试在你的模型上使用这个[DefaultValue(“”)公共字符串followEmailAddress{get;set;},中间有一个空文本,一个空的JSONonjectReference@Amir:我原来的答案可能是错误的,不起作用,所以我更新了它。调整您的自定义ContractResolver应该是您的最佳选择,请参阅我的更新答案。。。
JsonSerializerSettings settings = new JsonSerializerSettings 
{
    ...
    ContractResolver= new MyCustomContractResolver() 
};

public class MyCustomContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        return type.GetProperties().Select( p => 
           {
               var property = base.CreateProperty(p, memberSerialization);
               property.ValueProvider = new MyCustomNullValueProvider(p);
               return property;
           }).ToList();
    }
}

public class MyCustomNullValueProvider : IValueProvider
{
    PropertyInfo _MemberInfo;
    public MyCustomNullValueProvider(PropertyInfo memberInfo)
    {
        _MemberInfo = memberInfo;
    }

    public object GetValue(object target)
    {
        object value = _MemberInfo.GetValue(target);
        if (value == null) 
           result = "{}";
        else
           return value; 
    }

    public void SetValue(object target, object value)
    {
        if ((string)value == "{}")
            value = null;
        _MemberInfo.SetValue(target, value);
    }
}