【问题标题】:Deserializing JSON with an empty value that was serialized as {}使用序列化为 {} 的空值反序列化 JSON
【发布时间】:2017-06-15 17:30:28
【问题描述】:

我正在使用 Newtonsoft Json 转换器来序列化和反序列化对象,它对我的​​程序非常有用。

但是如果存储在对象中的任何值是 null/空,它们将被序列化为{},无法反序列化,我的程序将停止。

例如,如果我反序列化以下代码,一切正常:

{
"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 });

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

【问题讨论】:

  • 它会导致什么“问题”,您的研究表明了什么?
  • 每当反序列化一个空值时,我的程序就会出错。如果我注释掉 BlankObject 类中的空值(在本例中为 Thing1 和 Thing4),则反序列化将起作用。 int Thing1 { get; set; }
  • 问题是"Thing1" 的值有时是整数,有时是未知类型的对象。为此类属性创建DataColumn 时,Json.NET 应该使用什么类型?如果您事先知道"Thing1" 的正确类型,您可以创建自己的DataTableConverter 版本,如here 所示。

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


【解决方案1】:

你需要有如下的类结构:

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

【讨论】:

  • 哦,我已经找到了我的问题,刚刚发布了对我有用的解决方案。
【解决方案2】:

感谢@dbc 的评论解决了我的问题

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

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

我的解决方案是通过像这样从数据库中读取,将数据库的结果序列化为 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; }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    相关资源
    最近更新 更多