Schon vor sehr langer Zeit habe ich über JSON-RSS nachgedacht. Dabei ging es mir darum, den Newsfeed-Standard RSS statt mit XML in dem deutlich leichtgewichtigeren und vor allen Dingen mit JavaScript direkt lesbaren JSON zu erzeugen. Inzwischen habe ich ein paar neue Erkenntnisse zu dem aus 2011 stammenden JSON-RSS, und nenne diesen „Standard“ einfach JSON-RSS 2018.

Die Grundidee ist es, das XML mittels einer allgemein gültigen Übersetzungsregel in JSON zu übersetzen. Ein paar Besonderheiten gibt es aber, da XML deutlich anders strukturiert ist als JSON. Die (etwas unscharfen) Regeln sehen wie folgt aus:

  1. Tags
    1. Das Root-Element des XMLs entfällt, und ist das Root-JSON-Objekt.
    2. Tags im XML werden zu Objekt-Eigenschaften in JSON
    3. Tags, die mehrfach vorkommen können, werden zu einer Objekteigenschaft im JSON, deren Name der Mehrzahl des ursprünglichen Tagnamens entspricht, z.B. <item>als items. Die Eigenschaft muss dann ein Array von Objekten enthalten, wobei jedes Objekt die Eigenschaften des ursprünglichen Tags enthalten muss.
    4. Tag-Inhalte in XML werden zu Strings, Integers oder Numbers in JSON.
  2. Attribute
    1. Tags mit einem einzigen Attribut und ohne weiteren Inhalt müssen als Objekt geschrieben werden, bei dem der Tagname die Objekteigenschaft und der Attributwert der Objektwert wird.
    2. Tags mit einem einzigen, unwichtigen Attribut können ohne Ausgabe des Attributes umgesetzt werden, wie in 1.4 beschrieben.
    3. Tags mit mehreren Attributen und Kindknoten im XML werden zu gleichberechtigten Kind-Eigenschaften des Objekts in XML. Falls ein Attributname und Sub-Tag identisch sind, wird das Attribut nicht angegeben.
    4. Tags mit mehreren Attributen und einem Tag-Inhalt werden wie in 1.2 behandelt, wobei der Tag-Inhalt in einer Eigenschaft namens _content ausgegeben wird.
  3. Namensräume
    1. Die Definition von Namensräumen via xmlns wird in JSON durch ein xmlns-Objekt gelöst, in dem die einzelnen Namensräume zu Objekteigenschaften werden.
    2. Tags mit Namensräumen werden in JSON an Stelle des : mit _ geschrieben, z.B. <geo:fields> als geo_fields.

Umgemünzt auf JSON-RSS 2018 ergibt dies beispielhaft die folgende Ausgabe:

{
  "version": "2.0",
  "xmlns": {
    "atom": "http://www.w3.org/2005/Atom",
    "content": "http://purl.org/rss/1.0/modules/content/",
    "georss": "http://www.georss.org/georss",
    "gml": "http://www.opengis.net/gml"
  },
  "channel": {
    "title": "fboës - Der Blog | Startseite",
    "link": "https://journal.3960.org/",
    "description": "Programmierung, Raumfahrt und Kurioses: Der Blog von und mit Frank Boës.",
    "language": "de-DE",
    "copyright": "© 2008-2018 Creative Commons BY",
    "atom_link": {
      "href": "https://journal.3960.org/rss.json",
      "rel": "self",
      "type": "application/rss+json"
    },
    "lastBuildDate": "Tue, 14 Aug 2018 21:57:32 +0200",
    "atom_updated": "2018-08-14T21:57:32+02:00",
    "generator": "blogophon",
    "image": {
      "url": "https://cdn.3960.org/images/tile-128x128.png",
      "title": "fboës - Der Blog",
      "link": "https://journal.3960.org/"
    },
    "items": [
      {
        "language": "de-DE",
        "title": "Meine Git-Werkzeugkiste",
        "description": "Lorem ipsum...",
        "content_encoded": "<p>More lorem ipsum...</p>",
        "link": "https://journal.3960.org/posts/2018-07-19-git-werkzeugkiste/",
        "pubDate": "Thu, 19 Jul 2018 19:40:55 +0200",
        "atom_published": "2018-07-19T19:40:55+02:00",
        "atom_updated": "2018-08-14T08:10:35+02:00",
        "guid": "user/posts/2018-07-19-git-werkzeugkiste.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Programmierung",
          "Webdevelop",
          "Git",
          "Für Tumblr"
        ]
      }
    ]
  }
}

Dieser Blog produziert ein lebendes JSON-RSS-Beispiel in dem „JSON-RSS 2018“-Standard.

Die bessere Alternative

Aber bei aller Begeisterung für das Gedankenexperiment „JSON-RSS“ empfehle ich doch, auf den seit 2017 existierenden und sich immer noch rapide verbreitenden Standard JSON Feed zu setzen. Neben einer zunehmenden Verbreitung auf Publikations-Seite (u.a. in Wordpress) und einer allgemein akzeptierten Standardisierung gibt es immer mehr Bibliotheken, die das Lesen von JSON-Feeds ermöglichen.

Darüber hinaus hat JSON-Feed von vorne herein Erweiterungsmöglichkeiten, die ähnlich wie Namespacing in XML funktionieren.

Und RSS?

Übrigens ist RSS gerade wieder in aller Munde: Die Diskussion, ob RSS tot sei, hat in letzter Zeit zu neuen Artikeln geführt:

Meiner Meinung nach kann RSS niemals sterben, wenn man sich die fantastischen Möglichkeiten für seine Nutzung anschaut, die sich auf technischer Ebene eröffnen.