访问可能存在或不存在的子元素时避免对象空引用异常(JSON)

时间:2014-11-10 17:19:50

标签: c# json class exception null

我已将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,
        ...
     );

如你所见,我有很多子元素,有时在Insert方法中我得到以下错误:

  

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

很难检查这样的东西:

  

vn.price.message

上层对象(作为插入方法中的参数)有错误,因为json数据有时没有价格元素,因此没有消息之后。
我怎么能将这些参数转换为null?

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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