diff --git a/src/fields/OembedField.php b/src/fields/OembedField.php
index 5fc468f..d21cd8b 100755
--- a/src/fields/OembedField.php
+++ b/src/fields/OembedField.php
@@ -18,7 +18,10 @@
 use craft\gql\resolvers\elements\MatrixBlock as MatrixBlockResolver;
 use craft\gql\types\generators\MatrixBlockType as MatrixBlockTypeGenerator;
 use craft\gql\types\QueryArgument;
+use craft\helpers\ArrayHelper;
 use craft\helpers\Gql as GqlHelper;
+use craft\helpers\Json;
+use craft\helpers\UrlHelper;
 use GraphQL\Type\Definition\Type;
 use wrav\oembed\gql\OembedFieldTypeGenerator;
 use wrav\oembed\Oembed;
@@ -46,6 +49,11 @@ class OembedField extends Field
      * @var array
      */
     public $oembed = [];
+    
+    /**
+     * @var mixed|null
+     */
+    protected $value;
 
     // Static Methods
     // =========================================================================
@@ -105,23 +113,38 @@ public function getContentGqlType()
      */
     public function normalizeValue($value, ElementInterface $element = null)
     {
-        if (is_array($value)) {
-            if (isset($value['url'])) {
-                return new OembedModel($value['url']);
-            }
+        // If null, don’t proceed
+        if ($value === null) {
+            return null;
         }
-
-        if (is_string($value) && $decValue = json_decode($value, true)) {
-            if (isset($decValue['url'])) {
-                return new OembedModel($decValue['url']);
-            }
+        
+        // If an instance of `OembedModel` and URL is set, return it
+        if ($value instanceof OembedModel && $value->url) {
+            return $this->value = $value;
         }
 
-        $oembed = $value ? new OembedModel($value) : null;
+        // If JSON object string, decode it and use that as the value
+        if (Json::isJsonObject($value)) {
+            $value = Json::decode($value); // Returns an array
+        }
 
-        $this->oembed = $oembed;
+        // If array with `url` attribute, that’s our url so update the value
+        if (is_array($value)) {
+            $value = ArrayHelper::getValue($value, 'url');
+        }
 
-        return $oembed;
+        // Run `getValue` twice to avoid https://github.com/wrav/oembed/issues/74
+        if (is_array($value)) {
+            $value = ArrayHelper::getValue($value, 'url');
+        }
+        
+        // If URL string, return an instance of `OembedModel`
+        if (is_string($value) && UrlHelper::isFullUrl($value)) {
+            return $this->value = new OembedModel($value);
+        }
+        
+        // If we get here, something’s gone wrong
+        return null;
     }
 
     /**