使用序列化为{}的空值反序列化JSON

时间:2017-06-15 17:30:28

标签: c# json serialization asp.net-core deserialization

我使用Newtonsoft Json Converter来序列化和反序列化对象,它对我的​​程序非常有用。

但是如果对象中存储的任何值都为null / empty,则它们被序列化为{},无法反序列化,并且程序停止。

例如,如果我反序列化以下代码,一切都很有效:

{
"Thing1": 2,
"Thing2": false,
"Thing3": "string",
"Thing4": "2017-10-28T14:04:24.74"
}

但是如果我尝试反序列化以下代码:

{
"Thing1": {},
"Thing2": false,
"Thing3": "",
"Thing4": {}
} 

Thing1和Thing4都会在反序列化过程中引起问题。

不确定这是否与我从数据库中读取序列化的方式有关:

var r = Serialize(myReader);

string json = JsonConvert.SerializeObject(r, 
                        Formatting.Indented, 
                        new JsonSerializerSettings 
                        { 
                            NullValueHandling = NullValueHandling.Ignore 
                        });

public IEnumerable<Dictionary<string, object>> Serialize(SqlDataReader reader)
           {
            var results = new List<Dictionary<string, object>>();
            var cols = new List<string>();
            for (var i = 0; i < reader.FieldCount; i++)
                cols.Add(reader.GetName(i));

            while (reader.Read())
                results.Add(SerializeRow(cols, reader));

            return results;
            }

private Dictionary<string, object> SerializeRow(IEnumerable<string> cols,
                                                    SqlDataReader reader)
            {
                var result = new Dictionary<string, object>();
                foreach (var col in cols)
                    result.Add(col, reader[col]);
                return result;
            }

我已经使用过:

new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }

在我的解串器中:

BlankObject blnkObj = JsonConvert.DeserializeObject<BlankObject>(json, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

如何反序列化空值?提前致谢。

2 个答案:

答案 0 :(得分:1)

您需要具有以下类结构:

public class RootObject
{
    public object Thing1 { get; set; }
    public bool Thing2 { get; set; }
    public string Thing3 { get; set; }
    public object Thing4 { get; set; }
}

答案 1 :(得分:0)

感谢@dbc

的评论,弄清了我的问题

空值的对象在JSON中被序列化为{}而不是null

反序列化程序不喜欢将{}反序列化为int。因为 null对象 int DateTime 类型不同。

我的解决方案是通过从数据库中读取数据库的结果来序列化null而不是{}

BlankClass test = new BlankClass();
string json = "";

if (myReader.Read())
{
      test.Thing1 = (int)myReader[0];
      test.Thing2 = (bool)myReader[1];
      test.Thing3 = (string)myReader[2];
      test.Thing4 = (Datetime?)myReader[3];
      json = JsonConvert.SerializeObject(test, Formatting.Indented);
 }

 class BlankClass
 {
      int Thing1 { get; set; }
      bool Thing2 { get; set; }
      string Thing3 { get; set; }
      DateTime? Thing4 { get; set; }
 }