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