ANY23-381 fix illegal unescaped characters in JSON-LD
authorHans <firedrake93@gmail.com>
Thu, 2 Aug 2018 21:33:36 +0000 (16:33 -0500)
committerHans <firedrake93@gmail.com>
Thu, 2 Aug 2018 21:45:17 +0000 (16:45 -0500)
core/src/main/java/org/apache/any23/extractor/rdf/BaseRDFExtractor.java
core/src/test/java/org/apache/any23/extractor/html/EmbeddedJSONLDExtractorTest.java
test-resources/src/test/resources/html/html-jsonld-unescaped-characters.html [new file with mode: 0644]

index 9e24412..c0994bd 100644 (file)
@@ -241,14 +241,7 @@ public abstract class BaseRDFExtractor implements Extractor.ContentExtractor {
                 int c = stream.read();
 
                 if (inQuote) {
-                    if (inEscape) {
-                        inEscape = false;
-                    } else if (c == '"') {
-                        inQuote = false;
-                    } else if (c == '\\') {
-                        inEscape = true;
-                    }
-                    return c;
+                    return readQuoted(c, stream);
                 }
 
                 //we're not in a quote
@@ -284,6 +277,70 @@ public abstract class BaseRDFExtractor implements Extractor.ContentExtractor {
 
         }
 
+        private int readQuoted(int c, PushbackInputStream stream) throws IOException {
+            if (inEscape) {
+                switch (c) {
+                    case 'u':
+                        //TODO: validate that 'u' is followed by 4 hex chars?
+                    case '"':
+                    case '\\':
+                    case '/':
+                    case 'b':
+                    case 'f':
+                    case 'n':
+                    case 'r':
+                    case 't':
+                    case -1:
+                        inEscape = false;
+                        return c;
+                    default:
+                        stream.unread(c);
+                        inEscape = false;
+                        return '\\';
+                }
+            } else {
+                switch (c) {
+                    case '\\':
+                        break;
+                    case '\n':
+                        stream.unread('n');
+                        break;
+                    case '\r':
+                        stream.unread('r');
+                        break;
+                    case '\b':
+                        stream.unread('b');
+                        break;
+                    case '\f':
+                        stream.unread('f');
+                        break;
+                    case '\t':
+                        stream.unread('t');
+                        break;
+                    case '"':
+                        inQuote = false;
+                        return c;
+                    case -1:
+                        return c;
+                    default:
+                        if (c < 0x20 || c == 0x7f) {
+                            String hex = Integer.toHexString(c);
+                            int ind = hex.length() - 1;
+                            stream.unread(hex.charAt(ind));
+                            stream.unread(ind == 0 ? '0' : hex.charAt(--ind));
+                            stream.unread(ind == 0 ? '0' : hex.charAt(--ind));
+                            stream.unread(ind == 0 ? '0' : hex.charAt(--ind));
+                            stream.unread('u');
+                            break;
+                        } else {
+                            return c;
+                        }
+                }
+                inEscape = true;
+                return '\\';
+            }
+        }
+
         private int stripComments(int c, PushbackInputStream stream) throws IOException {
             switch (c) {
                 case '/':
index 30a0773..41a0711 100644 (file)
@@ -70,6 +70,18 @@ public class EmbeddedJSONLDExtractorTest extends AbstractExtractorTestCase {
                assertStatementsSize(null, null, null, 30);
        }
 
+       @Test
+       public void testJSONLDUnescapedCharacters() {
+               assertExtract("/html/html-jsonld-unescaped-characters.html");
+               assertModelNotEmpty();
+               assertStatementsSize(null, null, null, 375);
+               assertContains(RDFUtils.iri("http://schema.org/name"), "Weezer & Pixies\\\u0008");
+               assertContains(RDFUtils.iri("http://schema.org/description"),
+                               "#1 MAGIC SHOW IN L.A.\nThe current WINNER of the CW’s Penn & Teller’s FOOL US, Illusionist " +
+                                               "extraordinaire Ivan Amodei is on a national tour with his show INTIMATE ILLUSIONS." +
+                                               "\n\nCurrently, on an ei...");
+       }
+
        @Override
        protected ExtractorFactory<?> getExtractorFactory() {
                return new EmbeddedJSONLDExtractorFactory();
diff --git a/test-resources/src/test/resources/html/html-jsonld-unescaped-characters.html b/test-resources/src/test/resources/html/html-jsonld-unescaped-characters.html
new file mode 100644 (file)
index 0000000..7b91411
--- /dev/null
@@ -0,0 +1,536 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+--> <!-- Excerpted from  http://losangeles.eventful.com/events  -->
+<html xml:lang="en" lang="en" >
+<head>
+    <title>Events and things to do in Los Angeles, CA - concerts, movies, comedy - Eventful</title>
+</head>
+
+<body>
+
+<script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "Weezer & Pixies\\b",
+    "description": "",
+    "startDate": "Wednesday, August  8, 2018  7:00 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/040/435/710-7.png_/weezer-pixies-10.png",
+    "location": {
+      "@type": "Place",
+      "name": "LA Forum",
+      "url": "//losangeles.eventful.com/venues/la-forum-/V0-001-000189244-3",
+      "address": {
+        "streetAddress": "3900 West Manchester Boulevard",
+        "addressLocality": "Inglewood",
+        "addressRegion": "California",
+        "postalCode": "90305"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/weezer-pixies-/E0-001-115047966-2/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "Weezer"
+        },        {
+          "@type": "MusicGroup",
+          "name": "Pixies"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "Jackson Browne",
+    "description": "",
+    "startDate": "Saturday, August  4, 2018  7:30 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/003/492/453-7.jpeg_/jackson-browne-53.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "The Greek Theatre",
+      "url": "//losangeles.eventful.com/venues/the-greek-theatre-/V0-001-001461305-9",
+      "address": {
+        "streetAddress": "2700 North Vermont",
+        "addressLocality": "Los Angeles",
+        "addressRegion": "California",
+        "postalCode": "90027"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/jackson-browne-/E0-001-116531839-2/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "Jackson Browne"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "TAILGATE FEST",
+    "description": "",
+    "startDate": "Saturday, September  1, 2018 12:30 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/003/932/712-8.jpeg_/toby-keith-12.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "LA Forum",
+      "url": "//losangeles.eventful.com/venues/la-forum-/V0-001-000189244-3",
+      "address": {
+        "streetAddress": "3900 West Manchester Boulevard",
+        "addressLocality": "Inglewood",
+        "addressRegion": "California",
+        "postalCode": "90305"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/tailgate-fest-/E0-001-113753340-2/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "Toby Keith"
+        },        {
+          "@type": "MusicGroup",
+          "name": "Randy Houser"
+        },        {
+          "@type": "MusicGroup",
+          "name": "Nelly"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "Shakira - EL Dorado World Tour",
+    "description": "",
+    "startDate": "Wednesday, August 29, 2018  7:30 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/039/725/816-6.jpeg_/shakira-16.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "LA Forum",
+      "url": "//losangeles.eventful.com/venues/la-forum-/V0-001-000189244-3",
+      "address": {
+        "streetAddress": "3900 West Manchester Boulevard",
+        "addressLocality": "Inglewood",
+        "addressRegion": "California",
+        "postalCode": "90305"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/shakira-el-dorado-world-tour-/E0-001-114205018-9/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "Shakira"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "Joe Bonamassa",
+    "description": "",
+    "startDate": "Friday, November 23, 2018  8:00 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/004/257/504-4.jpeg_/joe-bonamassa-04.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "Terrace Theater @ Long Beach Convention and Entertainment Center",
+      "url": "//losangeles.eventful.com/venues/terrace-theater-long-beach-convention-and-ente-/V0-001-002167702-8",
+      "address": {
+        "streetAddress": "300 E. Ocean Blvd.",
+        "addressLocality": "Long Beach",
+        "addressRegion": "California",
+        "postalCode": "90802"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/joe-bonamassa-/E0-001-113400428-2/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "Joe Bonamassa"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "Elton John",
+    "description": "",
+    "startDate": "Saturday, February  2, 2019  8:00 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/000/770/159-6.jpeg_/elton-john-59.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "LA Forum",
+      "url": "//losangeles.eventful.com/venues/la-forum-/V0-001-000189244-3",
+      "address": {
+        "streetAddress": "3900 West Manchester Boulevard",
+        "addressLocality": "Inglewood",
+        "addressRegion": "California",
+        "postalCode": "90305"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/elton-john-/E0-001-111352091-6/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "Elton John"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "The Tallest Man On Earth",
+    "description": "",
+    "startDate": "Thursday, November 29, 2018  8:00 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/002/748/067-3.jpeg_/the-tallest-man-on-earth-67.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "Immanuel Presbyterian Church",
+      "url": "//losangeles.eventful.com/venues/immanuel-presbyterian-church-/V0-001-000204461-8",
+      "address": {
+        "streetAddress": "3300 Wilshire Boulevard",
+        "addressLocality": "Los Angeles",
+        "addressRegion": "California",
+        "postalCode": "90010"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/tallest-man-earth-/E0-001-112634153-1/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "The Tallest Man On Earth"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "LSD Tour: Lucinda Williams/Steve Earle/Dwight Yoakam pres. by SiriusXM",
+    "description": "",
+    "startDate": "Thursday, August  2, 2018  7:00 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/004/209/928-9.jpeg_/lucinda-williams-28.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "The Greek Theatre",
+      "url": "//losangeles.eventful.com/venues/the-greek-theatre-/V0-001-001461305-9",
+      "address": {
+        "streetAddress": "2700 North Vermont",
+        "addressLocality": "Los Angeles",
+        "addressRegion": "California",
+        "postalCode": "90027"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/lsd-tour-lucinda-williamssteve-earledwight-yo-/E0-001-114053008-9/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "Lucinda Williams"
+        },        {
+          "@type": "MusicGroup",
+          "name": "Steve Earle"
+        },        {
+          "@type": "MusicGroup",
+          "name": "Dwight Yoakam"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "Event",
+    "name": "#1 Magic Show in L.A.",
+    "description": "#1 MAGIC SHOW IN L.A.
+The current WINNER of the CW’s Penn & Teller’s FOOL US, Illusionist extraordinaire Ivan Amodei is on a national tour with his show INTIMATE ILLUSIONS.
+
+Currently, on an ei...",
+    "startDate": "Saturday, August 11, 2018  4:00 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/040/358/185-9.png_/1-magic-show-la-85.png",
+    "location": {
+      "@type": "Place",
+      "name": "Beverly Wilshire Hotel",
+      "url": "//losangeles.eventful.com/venues/beverly-wilshire-hotel-/V0-001-003541383-4",
+      "address": {
+        "streetAddress": "9500 Wilshire Boulevard",
+        "addressLocality": "Beverly Hills",
+        "addressRegion": "California",
+        "postalCode": "90212"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/1-magic-show-la-/E0-001-114704991-1/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "Person",
+          "name": "Ivan Amodei"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "Avenged Sevenfold",
+    "description": "If you missed Avenged Sevenfold last year, don’t worry – they’re still on tour!! This year, they’re teaming up with the Prophets of Rage and Three Days Grace – bringing the End Of The World Tour to...",
+    "startDate": "Wednesday, August 22, 2018  7:00 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/040/435/755-0.png_/avenged-sevenfold-55.png",
+    "location": {
+      "@type": "Place",
+      "name": "LA Forum",
+      "url": "//losangeles.eventful.com/venues/la-forum-/V0-001-000189244-3",
+      "address": {
+        "streetAddress": "3900 West Manchester Boulevard",
+        "addressLocality": "Inglewood",
+        "addressRegion": "California",
+        "postalCode": "90305"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/avenged-sevenfold-/E0-001-115048054-3/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "Avenged Sevenfold"
+        },        {
+          "@type": "MusicGroup",
+          "name": "Prophets of Rage"
+        },        {
+          "@type": "MusicGroup",
+          "name": "Three Days Grace"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "DAVID ALLAN COE",
+    "description": " <br>Location:8901 SUNSET BLVD.<br>Venue:WHISKY A GO GO<br><a>Buy Tickets</a><br><p><br></p>",
+    "startDate": "Tuesday, August 14, 2018  8:00 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/004/225/729-0.jpeg_/david-allan-coe-29.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "Whisky A Go-Go",
+      "url": "//losangeles.eventful.com/venues/whisky-a-gogo-/V0-001-001379983-9",
+      "address": {
+        "streetAddress": "8901 Sunset Boulevard",
+        "addressLocality": "West Hollywood",
+        "addressRegion": "California",
+        "postalCode": "90069"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/david-allan-coe-/E0-001-113709667-3/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "David Allan Coe"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "Event",
+    "name": "Phantom Of The Opera",
+    "description": "",
+    "startDate": "Thursday, June  6, 2019  8:00 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/014/885/834-4.jpeg_/the-phantom-of-the-opera-34.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "Pantages Theatre",
+      "url": "//losangeles.eventful.com/venues/pantages-theatre-/V0-001-000189214-2",
+      "address": {
+        "streetAddress": "6233 Hollywood Boulevard",
+        "addressLocality": "Los Angeles",
+        "addressRegion": "California",
+        "postalCode": "90028"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/phantom-opera-/E0-001-114073063-4@2019060620/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "Person",
+          "name": "The Phantom of the Opera"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "Elton John",
+    "description": "There’s nothing better than seeing your favorite artist take to the live stage…. so if you love Elton John then be sure to head on down for Friday 1st February 2019, for his LAST EVER tour! With a ...",
+    "startDate": "Friday, February  1, 2019  7:00 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/040/436/073-0.jpeg_/elton-john-73.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "LA Forum",
+      "url": "//losangeles.eventful.com/venues/la-forum-/V0-001-000189244-3",
+      "address": {
+        "streetAddress": "3900 West Manchester Boulevard",
+        "addressLocality": "Inglewood",
+        "addressRegion": "California",
+        "postalCode": "90305"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/elton-john-/E0-001-115048356-8/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "Elton John"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "OneRepublic",
+    "description": "
+",
+    "startDate": "Tuesday, August  7, 2018  8:00 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/004/214/493-2.jpeg_/onerepublic-93.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "The Theatre at Ace Hotel",
+      "url": "//losangeles.eventful.com/venues/the-theatre-at-ace-hotel-/V0-001-007549478-3",
+      "address": {
+        "streetAddress": "929 South Broadway",
+        "addressLocality": "Los Angeles",
+        "addressRegion": "California",
+        "postalCode": "90015"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/onerepublic-/E0-001-116490632-1/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "OneRepublic"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "ALT 98.7 Summer Camp 2018  - Death Cab For Cutie, ODESZA, CHVRCHES, Judah & The Lion, AJR, Sir Sly, Jungle, lovelytheband, Superorganism and Two Feet",
+    "description": " <p>Attention Campers! <strong>ALT 98.7 Summer Camp</strong> is BACK for another year of sceneary and epic performances. <p>This year&#39;s stacked lineup includes: <strong>Death Cab For Cutie</str...",
+    "startDate": "Sunday, August 12, 2018  4:00 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/023/875/184-5.jpeg_/death-cab-for-cutie-84.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "Queen Mary",
+      "url": "//losangeles.eventful.com/venues/queen-mary-/V0-001-000841320-9",
+      "address": {
+        "streetAddress": "1126 Queens Highway",
+        "addressLocality": "Long Beach",
+        "addressRegion": "California",
+        "postalCode": "90802"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/alt-987-summer-camp-2018-death-cab-cutie-odesza-/E0-001-114486866-1/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "Death Cab for Cutie"
+        },        {
+          "@type": "MusicGroup",
+          "name": "Judah & The Lion"
+        },        {
+          "@type": "MusicGroup",
+          "name": "CHVRCHES"
+        },        {
+          "@type": "MusicGroup",
+          "name": "ODESZA"
+        },        {
+          "@type": "MusicGroup",
+          "name": "AJR"
+        },        {
+          "@type": "MusicGroup",
+          "name": "Superorganism"
+        }    ]
+  }
+</script><script type="application/ld+json">
+  {
+    "@context": "http://schema.org",
+    "@type": "MusicEvent",
+    "name": "Nine Inch Nails: Cold and Black and Infinite North America 2018",
+    "description": "",
+    "startDate": "Saturday, December  8, 2018  6:30 PM",
+    "image": "//d1marr3m5x4iac.cloudfront.net/images/perspectivecrop373by249/I0-001/001/493/351-9.jpeg_/nine-inch-nails-51.jpeg",
+    "location": {
+      "@type": "Place",
+      "name": "Hollywood Palladium",
+      "url": "//losangeles.eventful.com/venues/hollywood-palladium-/V0-001-000228876-2",
+      "address": {
+        "streetAddress": "6215 Sunset Blvd.",
+        "addressLocality": "Los Angeles",
+        "addressRegion": "California",
+        "postalCode": "90028"
+      }
+    },
+    "offers": {
+      "@type": "Offer",
+      "url": "//losangeles.eventful.com/events/nine-inch-nails-cold-a-/E0-001-116683067-9@2018120818/tickets",
+      "availability": "http://schema.org/InStock"
+    },
+    "performer": [        {
+          "@type": "MusicGroup",
+          "name": "Nine Inch Nails"
+        },        {
+          "@type": "MusicGroup",
+          "name": "The Jesus and Mary Chain"
+        }    ]
+  }
+</script>
+
+</body>
+</html>
\ No newline at end of file