【问题标题】:JSON serialization - set default value for int typeJSON 序列化 - 为 int 类型设置默认值
【发布时间】:2015-11-17 11:45:18
【问题描述】:

我使用现有的 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

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

当我将此属性留空时,我应该如何初始化属性以便能够设置 int 值并获得“”?

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

【问题讨论】:

  • 尝试将你的属性设为 int 类型怎么样?这样它们就可以为空(并查看序列化对此有何反应)
  • 它们是整数。并且整数的默认值是 0 insted of null。
  • @iPogosov 他的意思是int?,而不是带问号的intint?Nullable<int> 的简写形式,这意味着类型可以是null 一个int。也就是说,将您的属性更改为:public int? CellProviderID { get; set; }

标签: c# json serialization json.net


【解决方案1】:

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

会被序列化为

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

这样你就可以解决这个问题了。

接下来,您必须更改序列化以忽略 null 值。如果你使用Json.Net,你的序列化必须是这样的:

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

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

【讨论】:

    【解决方案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":""}

    【讨论】:

    • 据我了解,如果我在 Inherited 类中具有 int 属性,当我可以设置默认 int 值(0)时,我将始终得到“”?
    • 试一试。我想是的。
    猜你喜欢
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2021-11-22
    • 2018-08-06
    • 1970-01-01
    • 2016-12-22
    相关资源
    最近更新 更多