2

我将尝试描述我的情况:

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

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

笔记:

  1. 是的,当我收到 json 时,我可以将所有“null”删除为“0”——但这不是一个好的解决方案。
  2. 我无法更改的默认值DataBase1
4

2 回答 2

4

还有第三种方式。您可以为此编写一个转换器类

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();
    }
}
于 2013-05-30T11:52:51.107 回答
0

您可以尝试使用 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

于 2019-11-15T22:13:37.463 回答