C# JSON序列化-设置int类型的默认值

C# JSON序列化-设置int类型的默认值,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我使用exist API,无法更改它 所以我有一些可变的CellProviderID 它看起来像是一个int,因为当我设置int值时,服务器返回预期的响应 "CellProviderID":5,"CellProviderID2":7,"CellProviderID3":2 当我将此值保留为空并且在序列化后得到以下值时,会出现问题: "CellProviderID":0,"CellProviderID2":0,"CellProviderID3":0 因为0是int类型的默认值。并且服务器返回一

我使用exist API,无法更改它

所以我有一些可变的CellProviderID

它看起来像是一个int,因为当我设置int值时,服务器返回预期的响应

"CellProviderID":5,"CellProviderID2":7,"CellProviderID3":2
当我将此值保留为空并且在序列化后得到以下值时,会出现问题:

"CellProviderID":0,"CellProviderID2":0,"CellProviderID3":0
因为0是int类型的默认值。并且服务器返回一个错误:

{“ErrorCode”:10,“ErrorMessage”:“指定了单元格提供程序,但单元格编号为空,指定了寻呼机提供程序,但寻呼机编号为空”}

所以它看起来更像是某个枚举,而0没有值

当我将序列化json从

"CellProviderID":0,"CellProviderID2":0,"CellProviderID3":0

当我将此属性留空时,如何初始化属性以设置int值并获取“”

[JsonProperty]
public int CellProviderID { get; set; }
[JsonProperty]
public int CellProviderID2 { get; set; }
[JsonProperty]
public int CellProviderID3 { get; set; }

您可以将属性的返回类型从
int
更改为
int?
,因此默认值为
null

它将被序列化为

"CellProviderID":null,"CellProviderID2":null,"CellProviderID3":null
所以你可以做个交易

接下来,必须将序列化更改为忽略
null
值。如果您使用的是
Json.Net
,则序列化必须如下所示:

JsonConvert.SerializeObject(movie,Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })

因此,您的服务器将不会收到未初始化的值

您可以将属性的返回类型从
int
更改为
int?
,因此您将获得默认值
null

它将被序列化为

"CellProviderID":null,"CellProviderID2":null,"CellProviderID3":null
所以你可以做个交易

接下来,必须将序列化更改为忽略
null
值。如果您使用的是
Json.Net
,则序列化必须如下所示:

JsonConvert.SerializeObject(movie,Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })

因此,您的服务器将不会收到未初始化的值

您可以选择编写一个自定义JsonConverter并自己处理自定义序列化/反序列化

internal class Inherited
{
    public int MyProperty { get; set; }
    public int MyProperty2 { get; set; }
}

internal class CustomConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Inherited);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var data = value as Inherited;
        if (data != null)
        {
            writer.WriteStartObject();
            foreach (var item in typeof(Inherited).GetProperties())
            {
                writer.WritePropertyName(item.Name);
                switch (item.PropertyType.Name)
                {
                    case "Int32":
                        {
                            writer.WriteValue(default(int) == (int)item.GetValue(data, null) ? "" : item.GetValue(data, null).ToString());
                            break;
                        }
                }
            }

            writer.WriteEnd();
        }
    }
}

JsonSerializerSettings obj = new JsonSerializerSettings();
obj.Converters.Add(new CustomConverter());
var result = JsonConvert.SerializeObject(new Inherited(0) { MyProperty = 0, MyProperty2 = 0 }, obj);
导致-
{“MyProperty”:“”“MyProperty2”:“”}

您可以选择编写自定义JsonConverter并自行处理自定义序列化/反序列化

internal class Inherited
{
    public int MyProperty { get; set; }
    public int MyProperty2 { get; set; }
}

internal class CustomConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Inherited);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var data = value as Inherited;
        if (data != null)
        {
            writer.WriteStartObject();
            foreach (var item in typeof(Inherited).GetProperties())
            {
                writer.WritePropertyName(item.Name);
                switch (item.PropertyType.Name)
                {
                    case "Int32":
                        {
                            writer.WriteValue(default(int) == (int)item.GetValue(data, null) ? "" : item.GetValue(data, null).ToString());
                            break;
                        }
                }
            }

            writer.WriteEnd();
        }
    }
}

JsonSerializerSettings obj = new JsonSerializerSettings();
obj.Converters.Add(new CustomConverter());
var result = JsonConvert.SerializeObject(new Inherited(0) { MyProperty = 0, MyProperty2 = 0 }, obj);
导致-
{“MyProperty”:“”“MyProperty2”:“”}

尝试将属性设置为int类型如何?这样,它们可以为null(并查看序列化如何对此做出反应),它们是整数。整数的默认值是0,而不是null。@iPogosov他的意思是
int?
,而不是带问号的
int
int?
Nullable
的简写形式,这意味着类型可以是
null
int
。也就是说,将属性更改为:
public int?CellProviderID{get;set;}
将您的属性设置为int类型如何?这样,它们可以为null(并查看序列化如何对此做出反应),它们是整数。整数的默认值是0,而不是null。@iPogosov他的意思是
int?
,而不是带问号的
int
int?
Nullable
的简写形式,这意味着类型可以是
null
int
。也就是说,将属性更改为:
public int?CellProviderID{get;set;}
据我所知,如果继承的类中有int属性,当我可以设置默认int值(0)时,我将始终获得“”?请尝试一下。我想是的。据我所知,如果继承的类中有int属性,当我可以设置默认int值(0)时,我将始终得到“”?试试看。我认为是这样。