我使用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 });
答案 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; }
}