?-6ren"> ?-我将尝试描述我的情况: 我有 Windows 应用商店应用程序 (C#),它从远程数据库 (DataBase1) 接收数据,并将其存储在本地数据库中的隔离存储 (DataBase2) 中。对于 ex -6ren">
gpt4 book ai didi

c# - 将 json 中的 "null"替换为 "0"仅用于 int 还是使用 Nullable

转载 作者:行者123 更新时间:2023-12-02 05:02:33 26 4
gpt4 key购买 nike

我将尝试描述我的情况:

我有 Windows 应用商店应用程序 (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 时我有异常。

我有两个解决方法:

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

我的问题是:
哪种方法正确?
您可能有另一个想法,如何使用 Newtonsoft.Json 将“null”存储为“0”。
尝试解释你的答案。

注意:

  1. 是的,当我收到 json 时,我可以将所有“null”删除为“0”——但这不是好的解决方案。
  2. 我无法更改 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();
}
}

关于c# - 将 json 中的 "null"替换为 "0"仅用于 int 还是使用 Nullable<int>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16835188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com