public void loadFromDictionary(Dictionary <string, object> data)
        {
            if (data == null)
            {
                return;
            }

            //NOTE: fix for https://github.com/BranchMetrics/xamarin-branch-deep-linking/issues/97
            expirationDate = new DateTime(2200, 12, 30);

            if (data.ContainsKey("$canonical_identifier") && data["$canonical_identifier"] != null)
            {
                canonicalIdentifier = data["$canonical_identifier"].ToString();
            }
            if (data.ContainsKey("$canonical_url") && data["$canonical_url"] != null)
            {
                canonicalUrl = data["$canonical_url"].ToString();
            }
            if (data.ContainsKey("$og_title") && data["$og_title"] != null)
            {
                title = data["$og_title"].ToString();
            }
            if (data.ContainsKey("$og_description") && data["$og_description"] != null)
            {
                contentDescription = data["$og_description"].ToString();
            }
            if (data.ContainsKey("$og_image_url") && data["$og_image_url"] != null)
            {
                imageUrl = data["$og_image_url"].ToString();
            }
            if (data.ContainsKey("$publicly_indexable"))
            {
                if (!string.IsNullOrEmpty(data["$publicly_indexable"].ToString()))
                {
                    contentIndexMode = Convert.ToInt32(data["$publicly_indexable"].ToString());
                }
            }
            if (data.ContainsKey("$locally_indexable"))
            {
                if (!string.IsNullOrEmpty(data["$locally_indexable"].ToString()))
                {
                    localIndexMode = Convert.ToInt32(data["$locally_indexable"].ToString());
                }
            }
            if (data.ContainsKey("$exp_date"))
            {
                if (!string.IsNullOrEmpty(data["$exp_date"].ToString()))
                {
                    expirationDate = new DateTime(Convert.ToInt64(data["$exp_date"].ToString()) * 10000); // milliseconds to ticks
                }
            }
            if (data.ContainsKey("$keywords"))
            {
                if (data["$keywords"] != null)
                {
                    List <object> keywordsTemp = data["$keywords"] as List <object>;

                    if (keywordsTemp != null)
                    {
                        foreach (object obj in keywordsTemp)
                        {
                            keywords.Add(obj.ToString());
                        }
                    }
                }
            }
            if (data.ContainsKey("metadata"))
            {
                if (data["metadata"] != null)
                {
                    //Dictionary<string, object> metaTemp = data["metadata"] as Dictionary<string, object>;
                    Dictionary <string, object> metaTemp = JsonConvert.DeserializeObject <Dictionary <string, object> >(data["metadata"] as string);

                    if (metaTemp != null)
                    {
                        if (metaTemp.ContainsKey("+clicked_branch_link"))
                        {
                            if (metaTemp["+clicked_branch_link"].ToString().Equals("1"))
                            {
                                metaTemp["+clicked_branch_link"] = "true" as object;
                            }
                            else
                            {
                                metaTemp["+clicked_branch_link"] = "false" as object;
                            }
                        }

                        metadata.loadFromDictionary(metaTemp);
                    }
                }
            }
        }
        public void loadFromDictionary(Dictionary <string, object> data)
        {
            if (data == null)
            {
                return;
            }
            if (data.ContainsKey("$canonical_identifier") && data["$canonical_identifier"] != null)
            {
                canonicalIdentifier = data["$canonical_identifier"].ToString();
            }
            if (data.ContainsKey("$canonical_url") && data["$canonical_url"] != null)
            {
                canonicalUrl = data["$canonical_url"].ToString();
            }
            if (data.ContainsKey("$og_title") && data["$og_title"] != null)
            {
                title = data["$og_title"].ToString();
            }
            if (data.ContainsKey("$og_description") && data["$og_description"] != null)
            {
                contentDescription = data["$og_description"].ToString();
            }
            if (data.ContainsKey("$og_image_url") && data["$og_image_url"] != null)
            {
                imageUrl = data["$og_image_url"].ToString();
            }
            if (data.ContainsKey("$publicly_indexable"))
            {
                if (!string.IsNullOrEmpty(data["$publicly_indexable"].ToString()))
                {
                    contentIndexMode = Convert.ToInt32(data["$publicly_indexable"].ToString());
                }
            }
            if (data.ContainsKey("$locally_indexable"))
            {
                if (!string.IsNullOrEmpty(data["$locally_indexable"].ToString()))
                {
                    localIndexMode = Convert.ToInt32(data["$locally_indexable"].ToString());
                }
            }
            if (data.ContainsKey("$exp_date"))
            {
                if (!string.IsNullOrEmpty(data["$exp_date"].ToString()))
                {
                    expirationDate = new DateTime(Convert.ToInt64(data["$exp_date"].ToString()) * 10000); // milliseconds to ticks
                }
            }
            if (data.ContainsKey("$keywords"))
            {
                if (data["$keywords"] != null)
                {
                    List <object> keywordsTemp = data["$keywords"] as List <object>;

                    if (keywordsTemp != null)
                    {
                        foreach (object obj in keywordsTemp)
                        {
                            keywords.Add(obj.ToString());
                        }
                    }
                }
            }
            if (data.ContainsKey("metadata"))
            {
                if (data["metadata"] != null)
                {
                    Dictionary <string, object> metaTemp = data["metadata"] as Dictionary <string, object>;

                    if (metaTemp != null)
                    {
                        if (metaTemp.ContainsKey("+clicked_branch_link"))
                        {
                            if (metaTemp["+clicked_branch_link"].ToString().Equals("1"))
                            {
                                metaTemp["+clicked_branch_link"] = "true" as object;
                            }
                            else
                            {
                                metaTemp["+clicked_branch_link"] = "false" as object;
                            }
                        }

                        metadata.loadFromDictionary(metaTemp);
                    }
                }
            }
        }