我试着描述一下我的情况:
我有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时,我有异常。
我有两个想法如何解决它:
- 使
int Id
->int? Id
,并在setter更改"null"为"0"(并始终使用nulleable类型),但我不确定性能。 - 创建另一个可空字段(
int? IdCanBeNull
),其中存储来自DataBase1的值,然后在IdCanBeNull
的setter中设置嵌套值为Id
,并始终与int Id
(非可空类型)一起工作(将其保存在DataBase2
和其他)。更好的性能,但需要创建2xnumberofffields
我的问题是:
哪个是正确的方式?
也许你有另一个想法,如何使用Newtonsoft.Json
存储"null"到"0" .
试着解释你的答案。
注意:
- 是的,当我收到json时,我可以删除所有"null"到"0"-但这不是好的解决方案。
- 我不能改变
DataBase1
的默认值
还有第三种方法。您可以为
编写一个转换器类。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