【发布时间】:2014-03-10 21:48:24
【问题描述】:
所以我一直工作的公司要求我为需要使用 .NET 访问我们的 API 的客户公司制作 C# 库。到目前为止,我有一个工作库,但我一直在解析可选属性时遇到问题。我们在后端使用 mongoDB,而 mongoDB 不会存储未提供的属性,即使它们是在架构中定义的。
例如,我的架构可能如下所示:
{
name:String,
id:Number,
phone:String,
email:String,
experience:[]
}
我在哪里制作文档:
{
name:"joe",
id:5,
phone:"222-222-2222",
}
属性email 和experience 在我的文档中不存在,所以我的JSON 看起来与上面显示的完全一样。然而,这些值不是必需的值,但我仍然需要解析它的其余部分。问题是,当我在解析email 或experience 时解析上面所有可能值的代码时,解析器会抛出空引用异常,这是有充分理由的,因为我试图解析的值不存在我引用这些值的方式是这样的:
JObject o=JObject.Parse(json); //parse json to JObject json object
string name=(string)o["name"];
int id=(int)o["id"];
string phone=(string)o["phone"];
string email=(string)o["emain"];
List<string> exp=o["experience"].Select(t => (string)t).ToList();
现在我的代码更加客观,我使用 LINQ 创建了一个名为 Job 的对象和一个对象 Jobs 以存储 JObject 的方式,您可以使用 @ 的方法从中查询某些值987654330@ 使用原始 JSON 字符串初始化的对象。
我能想到的在 JSON 中处理可选属性的唯一方法是尝试/捕获每个值。这看起来很草率,我必须解析的 JSON 总共大约有 40-50 个属性。这似乎会非常缓慢并且代码混乱。我想知道我是否可以实现这是一种更清洁更有效的方式。
【问题讨论】:
-
你试过
var job = JsonConvert.DeserializeObject<Job>(json);吗? -
我不确定我是否理解。 MongoDB 是无模式的,对吧?你不应该解析任何东西。您可以将其作为 BSON 文档转储到 Mongo 中
-
@mason 它是 Json.Net 的类。
-
@tsturzl 看来你错过了一些东西。 转到 first_comment;
-
@tsturzl 你的问题在于你试图手动反序列化,那么这是 Json.NET 开箱即用的东西,就像第一条评论和埃文的回答一样。