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

时间:2015-11-17 11:45:18

标签: c# json serialization json.net

我使用现有的API而无法更改它。

所以我有一些变量 - CellProviderID。

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

"CellProviderID":5,"CellProviderID2":7,"CellProviderID3":2

当我将此值保留为空时出现问题,并且在序列化后我得到:

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

因为0是int类型的默认值。并且服务器返回错误:

  

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

所以它看起来更像是一些枚举,0没有值。

当我从

更改序列化的json时,它运行良好
"CellProviderID":0,"CellProviderID2":0,"CellProviderID3":0

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以将商家的退货类型从int更改为int?,这样您就会获得null值作为默认值。

它将被序列化为

"CellProviderID":null,"CellProviderID2":null,"CellProviderID3":null

所以你可以达成协议。

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

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

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

答案 1 :(得分:2)

您可以选择编写自定义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":""}