【问题标题】:Deserialize JSON with null values in array使用数组中的空值反序列化 JSON
【发布时间】:2014-03-20 09:26:31
【问题描述】:

我有以下 JSON 数组,它还可以为 var 数组中的某些元素保存空值。 var 数组中的元素始终是固定的。

 "vars": [
        {
            "varCol": [
                {
                    "visible": false, 
                    "val": 1, 
                }, 
                {
                    "visible": false, 
                    "val": 5, 
                }, 
                {
                    "visible": false, 
                    "val": 5, 
                }, 
                null
            ],
            "Type": "Type1"
            "UniqueId": "ID1"
        }, 
          {
            "varCol": [
                {
                    "visible": true, 
                    "val": 1, 
                }, 
                null,
                {
                    "visible": false, 
                    "val": 5, 
                }, 
                null
            ],
            "Type": "Type2", 
            "UniqueId": "ID2"
        } 
        ]

我有以下 C# 反序列化器类:

public class Var
{
    public int VarId { get; set; }
    public string Type { get; set; }
    public List<VarCol> VarCols { get; set; }
}
public class VarCol
{
    public int VarColId { get; set; }
    public bool Visible { get; set; }
    public float Val { get; set; }
}

我想要的输出是在 VarCol 中有一个条目,它始终保存数组中值的固定结构。在这种情况下,每个 vars 元素的 varCol 数组中有 4 个条目。 对于我正在使用的 JSON 的反序列化:

Var v = JToken.Parse(json_string).ToObject<Var>();

【问题讨论】:

    标签: c# javascript arrays json


    【解决方案1】:

    我想将此作为评论插入,但它太长了,所以我必须将其发布为答案。

    请注意逗号,因为您的 JSON 无效。我想你想要这样的东西:

        {
        "vars": [
            {
                "varCol": [
                    {
                        "visible": false,
                        "val": 1
                    },
                    {
                        "visible": false,
                        "val": 5
                    },
                    {
                        "visible": false,
                        "val": 5
                    },
                    null
                ],
                "Type": "Type1",
                "UniqueId": "ID1"
            },
            {
                "varCol": [
                    {
                        "visible": true,
                        "val": 1
                    },
                    null,
                    {
                        "visible": false,
                        "val": 5
                    },
                    null
                ],
                "Type": "Type2",
                "UniqueId": "ID2"
            }
        ]
    }
    

    祝你有美好的一天,

    阿尔伯托

    【讨论】:

    • 我已经更改了生产 JSON,但我错过了。生产 JSON 是合法的。 JSON 不是问题。感谢您的留言,但如果您能回答我的问题,将会很有帮助。问候
    • 那好吧。在我的项目中,我使用 JSON.net (james.newtonking.com/json) 并执行类似 MyClass myObject = (MyClass)JsonConvert.DeserializeObject(serializedJSONString, typeof(MyClass));并且当 serializedJSONString 是实际的 JSON 表示时完美工作。我从未检查过,但我认为序列化的字符串有 "Key": null insted of just null。
    【解决方案2】:

    不确定您要达到什么目的,因为 JToken.Parse() 处理 null 值的方式与处理任何其他对象值的方式几乎相同,因此 varCol 将始终有 4 个元素。

    这是一些测试代码:http://dotnetfiddle.net/9gGdH9

    【讨论】:

    • 谢谢亚历克斯。更正代码有效并且使用 JSON.NET 生成有效的 C# 类。我现在意识到,当使用 EF 将此反序列化的 C# 对象写入数据库时​​,某些事情无法按预期工作。这方面有什么想法吗?
    • 这取决于您的对象在数据库中的存储方式。如果 VarCol 与 Var 具有多对一关系,则 EF 可能会将对 Var 记录的引用存储在 VarCol 表中。但null 记录无法保存到数据库。这就是为什么回读只会带来那些已保存的记录。您可能需要在解析 JSON 后进行一些后处理,以便在保存到 DB 之前将 null 值替换为空记录。
    【解决方案3】:

    抱歉,我的问题具有误导性。 我面临的问题是通过实体框架将 Var 集合中的 null VarCol 保存到数据库中。我需要这个能够知道集合中的哪些元素是空的,因为我有一个固定大小的列表。我通过用空 VarCol 实例化空 VarCol 来解决这个问题,正如 Alex Skalozub 在他的一个 cmets 中指出的那样:

    这取决于您的对象在数据库中的存储方式。如果 VarCol 与 Var 存在多对一关系,EF 可能会存储引用 到 VarCol 表中的 Var 记录。但空记录不能保存到 数据库。这就是为什么回读只会带来那些记录 得救了。您可能需要在解析后进行一些后处理 JSON 在保存到数据库之前用空记录替换空值。 – Alex Skalozub 5 小时前

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-01
      • 2016-05-23
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多