C# 在数组中使用空值反序列化JSON

C# 在数组中使用空值反序列化JSON,c#,javascript,arrays,json,C#,Javascript,Arrays,Json,我有下面的JSON数组,它还可以为var数组中的一些元素保存空值。var数组中的元素总是固定的 "vars": [ { "varCol": [ { "visible": false, "val": 1, }, { "visible":

我有下面的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; }
}
公共类变量
{
公共int变量{get;set;}
公共字符串类型{get;set;}
公共列表VarCols{get;set;}
}
公共类VarCol
{
public int VarColId{get;set;}
公共布尔可见{get;set;}
公共浮点值{get;set;}
}
这里我想要的输出是在VarCol中有一个条目,它总是保存数组中固定的值结构。在本例中,varCol数组中每个vars元素有4个条目。 对于我正在使用的JSON的反序列化:

Var v = JToken.Parse(json_string).ToObject<Var>();
Var v=JToken.Parse(json_string.ToObject();
我想将此作为评论插入,但它太长了,所以我不得不将其作为答案发布。

请注意逗号,因为您的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"
        }
    ]
}
祝你今天愉快


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


下面是一些测试代码:

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


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


我修改了一个生产JSON,但我错过了。生产JSON是合法的。JSON不是问题所在。谢谢你的留言,但如果你能回答我的问题,我会很有帮助的。那好吧。在我的项目中,我使用JSON.net()并执行类似以下操作:MyClass myObject=(MyClass)JsonConvert.DeserializeObject(serializedJSONString,typeof(MyClass));当serializedJSONString是实际的JSON表示形式时,它可以完美地工作。我从来没有检查过,但我认为序列化字符串有“Key”:null而不是null。谢谢Alex。更正代码是否有效,并使用JSON.NET生成有效的C#类。我现在意识到,当使用EF将这个反序列化的C#对象写入数据库时,有些东西并没有像预期的那样工作。这方面有什么想法吗?这取决于对象在数据库中的存储方式。如果VarCol与Var存在多对一关系,EF可能会在
VarCol
表中存储对
Var
记录的引用。但
null
记录无法保存到数据库。这就是为什么回读只会带来那些已保存的记录。您可能需要在解析JSON之后进行一些后处理,以在保存到DB之前用空记录替换
null
值。