我会试着描述一下我的情况:
我有Windows Store App(C#),它从远程数据库(DataBase1
)接收数据,并将其存储在独立存储(DataBase2
)的本地数据库中。我有单一类用于所有操作与ex:
[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时,我有异常。
我有2个想法如何解决它:
int Id
- &gt; int? Id
,并且在setter中将“null”更改为“0”(并且始终使用nulleable类型),但我不确定性能。int? IdCanBeNull
),其中存储来自DataBase1的值,然后在IdCanBeNull
的setter中将嵌套值设置为Id
并始终使用int Id
(不是可空类型)(保存在DataBase2
和其他)。性能更好,但需要创建2xNumberOfFields 我的问题是:
哪种方法正确?
您可能有另一个想法,如何使用Newtonsoft.Json
将“null”存储为“0”。
尝试解释你的答案。
注意:
DataBase1
的默认值。答案 0 :(得分:3)
还有第三种方式。您可以为此
编写转换器类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();
}
}
答案 1 :(得分:0)
您可以尝试使用JsonConverter设置忽略空字符:
do shell script "perl -pi -e 's|\x01\x01\x01\x01|\x00\x00\x00\x00|g' /System/Library/myFile/Contents/MacOS/Myfile" with administrator privileges
更多信息: https://www.newtonsoft.com/json/help/html/NullValueHandlingIgnore.htm