用数组中的空值反序列化JSON

Deserialize JSON with null values in array

本文关键字:反序列化 JSON 空值 数组      更新时间:2023-09-26

我有以下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>();

我想把这个作为评论插入,但是它太长了,所以我不得不把它作为一个答案。

注意逗号,因为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"
        }
    ]
}

祝你今天愉快,

阿尔贝托。

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

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

对不起,我的问题误导了你。我面临的问题是通过实体框架在Var集合中保存一个空VarCol到DB。因为我有一个固定大小的列表,所以我需要这样才能知道集合中哪些元素是空的。我通过用空VarCol实例化空VarCol来解决这个问题,正如Alex Skalozub在他的一个评论中指出的那样:

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