【问题标题】:Avoid object null reference exception when accessing sub-elements that may or may not exist (JSON)访问可能存在也可能不存在的子元素时避免对象空引用异常 (JSON)
【发布时间】:2014-11-10 17:19:50
【问题描述】:

我已将 json 数据转换为 c# 类,并希望将获取数据插入到我的数据库中。
这是我的代码:

My_Json My_Json_res = JsonConvert.DeserializeObject<My_Json>(result_str_after_request);

Venue vn = My_Json_res.venue;
Contact vn_contact = My_Json_res.venue.venue_contact;
Location vn_location = My_Json_res.venue.venue_location;

DataLayer.venues.InsertRow(
        vn.venue_id,
        vn.venue_name,
        vn_contact.contact_phone,
        vn_contact.contact_twitter,
        vn_contact.contact_facebook,
        vn_contact.contact_facebookUsername,
        vn_contact.contact_facebookName,
        vn_location.location_address,
        vn_location.location_crossStreet,
        vn_location.location_lat,
        vn_location.location_lng,
        vn_location.location_distance,
        vn_location.location_postalCode,
        ...
     );

如你所见,我有很多子元素,有时在插入方法期间我得到以下错误:

NullReferenceException 未处理
对象引用未设置为对象的实例。

像这样检查存在是非常困难的:

vn.price.message

上层对象(作为insert方法中的参数)有错误,因为json数据有时没有price元素所以没有message在那之后。
我怎样才能将这些参数转换为null?

编辑:
这是我在 c# 类中的两个相关属性:

VENUE CLASS
[JsonProperty("price")]
public Price venue_price { get; set; }

PRICE CLASS
[JsonProperty("message")]
public string price_message { get; set; }

为此类 message 属性设置默认空值的最快方法是什么?

【问题讨论】:

  • 你不能让那些对象的属性总是返回一个对象吗?
  • @Lasse V. Karlsen 我使用在线转换器从 json 创建 c# 类。但我认为这是解决方案。请把它作为答案。
  • 当人们看到问题围绕着 NullReferenceException 错误消息时,有时会有点急切。然而,这个问题是关于类设计的,而不是(在我看来)该问题的重复。
  • 您是否在序列化这些对象以及反序列化它们?
  • 如果对象突然返回所有属性中的对象,序列化这将成为一场噩梦,因为任何地方都不会再有缺失值。

标签: c# json class exception null


【解决方案1】:

使用JToken.SelectToken() 方法查找值。如果它存在于完整路径中,则将返回令牌,您可以检索您的值。否则为空。

var token = obj.SelectToken("vn.price.message");
if (token != null)
{
    // do stuff with token
}

【讨论】:

  • 有超过 200 300 个子元素甚至更多,我不能对所有子元素都这样做,并寻找一种方法将所有不存在的元素自动转换为 null。还有其他想法吗?
  • 使用更好的数据结构。或者创建一个递归反射方法来检查每个级别并提取您的数据。
  • @MoonLight:为什么不呢?这就是您构建模型的方式。您将不得不以某种方式验证这些值。无论您是手动进行验证,还是让您使用的库为您完成验证,都由您决定。
猜你喜欢
  • 2011-02-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
相关资源
最近更新 更多