在json中将“null”替换为“0”仅用于int或使用Nullable <int>?</int>

时间:2013-05-30 11:39:57

标签: c# json.net

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

我有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个想法如何解决它:

  1. make int Id - &gt; int? Id,并且在setter中将“null”更改为“0”(并且始终使用nulleable类型),但我不确定性能。
  2. 创建另一个可为空的字段(int? IdCanBeNull),其中存储来自DataBase1的值,然后在IdCanBeNull的setter中将嵌套值设置为Id并始终使用int Id(不是可空类型)(保存在DataBase2和其他)。性能更好,但需要创建2xNumberOfFields
  3. 我的问题是:
    哪种方法正确?
    您可能有另一个想法,如何使用Newtonsoft.Json将“null”存储为“0”。
    尝试解释你的答案。

    注意:

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

2 个答案:

答案 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