取代“null"“0”;在json中仅用于int或使用Nullable

本文关键字:int 用于 Nullable json quot null 取代 | 更新日期: 2023-09-27 18:16:17

我试着描述一下我的情况:

我有Windows Store应用程序(c#),它从远程数据库(DataBase1)接收数据,并将其存储在隔离存储(DataBase2)的本地数据库中。我有一个类来处理所有的数据操作,例如:

[Table("Table")]
[DataContract]
public class Class1
{
    [PrimaryKey]
    [Column("id")]
    [DataMember(Name = "id")]
    public int Id { get; set; } 
}

这个类可以接受50多个字段。
我用Newtonsoft。Json:

 var class = JsonConvert.DeserializeObjectAsync<Class1>(json);

所有的工作都很好,但在DataBase1中所有的领域都有default value = null,当我收到null时,我有异常。

我有两个想法如何解决它:

  1. 使int Id -> int? Id,并在setter更改"null"为"0"(并始终使用nulleable类型),但我不确定性能。
  2. 创建另一个可空字段(int? IdCanBeNull),其中存储来自DataBase1的值,然后在IdCanBeNull的setter中设置嵌套值为Id,并始终与int Id(非可空类型)一起工作(将其保存在DataBase2和其他)。更好的性能,但需要创建2xnumberofffields

我的问题是:
哪个是正确的方式?
也许你有另一个想法,如何使用Newtonsoft.Json存储"null"到"0" .
试着解释你的答案。

注意:

  1. 是的,当我收到json时,我可以删除所有"null"到"0"-但这不是好的解决方案。
  2. 我不能改变DataBase1的默认值

取代“null"“0”;在json中仅用于int或使用Nullable<int>

还有第三种方法。您可以为

编写一个转换器类。
var list = JsonConvert.DeserializeObject<List<Class1>>(
                            "[{Id:5},{Id:0},{Id:null},{}]",
                             new MyConverter());

public class Class1
{
    public int Id { get; set; }
}
public class MyConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(int);
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.Value == null) return 0;
        return Convert.ToInt32(reader.Value);
    }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

您可以尝试使用JsonConverter设置来忽略空字符:

    Person person = new Person
{
    Name = "Nigal Newborn",
    Age = 1
};
string jsonIncludeNullValues = JsonConvert.SerializeObject(person, Formatting.Indented);
Console.WriteLine(jsonIncludeNullValues);
// {
//   "Name": "Nigal Newborn",
//   "Age": 1,
//   "Partner": null,
//   "Salary": null
// }
string jsonIgnoreNullValues = JsonConvert.SerializeObject(person, Formatting.Indented, new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore
});
Console.WriteLine(jsonIgnoreNullValues);
// {
//   "Name": "Nigal Newborn",
//   "Age": 1
// }

更多信息:https://www.newtonsoft.com/json/help/html/NullValueHandlingIgnore.htm