{"id":3488,"date":"2026-07-22T08:50:55","date_gmt":"2026-07-22T08:50:55","guid":{"rendered":"https:\/\/exponentialdecay.co.uk\/blog\/?p=3488"},"modified":"2026-07-22T08:50:55","modified_gmt":"2026-07-22T08:50:55","slug":"declarative-all-the-way-down-building-pronom-signatures-with-jsonid","status":"publish","type":"post","link":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/","title":{"rendered":"Declarative all the way down: Building PRONOM signatures with JSONID"},"content":{"rendered":"<p>PRONOM signatures are a form of <a href=\"https:\/\/exponentialdecay.co.uk\/blog\/declarative-programming-for-digital-preservationists-nttw8\/\" target=\"_blank\" rel=\"noopener\">declarative language<\/a>, you describe the anticipated behavior in PRONOM&#8217;s regular expression syntax and tools like DROID, FIDO, and Siegfried will interpret those instructions and attempt to match them against different files to return a file format identification.<\/p>\n<p>Normally, you will write PRONOM signatures by hand but doing so for file formats based on other <a href=\"https:\/\/exponentialdecay.co.uk\/blog\/file-format-building-blocks-primitives-in-digital-preservation\/\" target=\"_blank\" rel=\"noopener\">file format building blocks<\/a> can lead to inconsistencies. Bertrand Caron previously also <a href=\"https:\/\/github.com\/ffdev-info\/wikidp-issues\/issues\/36\" target=\"_blank\" rel=\"noopener\">recognized this<\/a> in the XML formats that are described with PRONOM signatures on Wikidata.<\/p>\n<p>XML can use single quotes <code>'<\/code> (hex: <code>0x27<\/code>) and double quotes <code>\"<\/code> (hex: <code>0x22<\/code>) for attribute data, and so, do we make a PRONOM signature with multiple sequences anticipating the use of either?<\/p>\n<p>The answer is more often than not likely to be <em>yes<\/em>, because the appearance of these values are often helpful for identifying boundaries for strings that we know must exist.<\/p>\n<p>But the more file formats that we need to add to PRONOM that are based on foundational formats like XML, or JSON, or similar, the more inconsistencies will creep in, such as sequences that are looking specifically for one byte sequence over another.<\/p>\n<p>The issue extends further if file formats allow data to appear at the beginning of file, or we need to account for a variable amount of white-space, or we want to start thinking about multi-byte character encoding.<\/p>\n<p>We can, and in the XML issue described by myself and Caron, I think the recommendation is very much to create editorial standards for signatures for file formats based on other baseline, structured data formats like XML, JSON, YAML, and so on.<\/p>\n<p>And standards are well and good, but what if tooling could help us?<\/p>\n<p>For JSON this is exactly what I have tried to do in JSONID.<\/p>\n<p>What does this feature look like? And what does it get us? Let&#8217;s take a look.<\/p>\n<p><!--more--><\/p>\n<h2>JSONID for PRONOM development<\/h2>\n<p>JSONID is described on <a href=\"https:\/\/coptr.digipres.org\/JSONID\" target=\"_blank\" rel=\"noopener\">COPTR<\/a> and I was able to introduce it at No Time To Wait in Dublin last year.<\/p>\n<p><iframe loading=\"lazy\" title=\"YouTube video player\" src=\"https:\/\/www.youtube.com\/embed\/ZMVb3Bc_irc?si=9I8rua4-iUZlgWkL\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>I will also be sharing a short paper at this years iPRES conference in Copenhagen.<\/p>\n<p>In short, JSONID provides a declarative language to describe data structures that can be represented in JSON, YAML, TOML, and JSONL\u2014structures that you can recognize as a document type or a <em>&#8220;file format&#8221;<\/em> that you might want to identify in your collections, analogous to why we use PRONOM.<\/p>\n<h2>Example syntax<\/h2>\n<p>A simple example of JSONID syntax might be as follows:<\/p>\n<pre>    [\r\n        { \"KEY\": \"name\", \"IS\": \"value\" },\r\n        { \"KEY\": \"schema\", \"CONTAINS\": \"\/schema\/version\/1.1\/\" },\r\n        { \"KEY\": \"data\", \"IS\": \"more data\" },\r\n    ]\r\n<\/pre>\n<p>The pseudo code for this is:<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li>Navigate to the JSON key &#8220;name&#8221; and determine that its value is &#8220;value&#8221;.<\/li>\n<li>If 1. Navigate to key &#8220;schema&#8221; and test that its value contains: &#8220;\/schema\/version\/1.1\/&#8221;.<\/li>\n<li>If 2. Navigate to key &#8220;data&#8221; and determine that its value is &#8220;more data&#8221;.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>This declarative structure will match JSON with these properties, e.g. one that looks as follows:<\/p>\n<pre>{\r\n    \"name\": \"value\",\r\n    \"schema\": \"_____\/schema\/version\/1.1\/_____\",\r\n    \"any_data\": [\r\n        1, 2, 3, 4\r\n    ],\r\n    \"data\": \"more data\"\r\n}\r\n<\/pre>\n<p>JSONID records <a href=\"https:\/\/ffdev-info.github.io\/jsonid\/registry\/\">85 similar sequences<\/a> at time of writing.<\/p>\n<p>JSONID&#8217;s key benefit is that it will work on YAML,, TOML, or JSONL without having to define any other signature, and PRONOM in comparison has a harder time with these other formats because they don&#8217;t have as much structure as JSON.<\/p>\n<p>The focus of this blog remains JSON because we can ask one very nice question:<\/p>\n<blockquote><p><em>Can we take JSONIDs signature definitions and turn them into PRONOM compatible signatures?<\/em><\/p><\/blockquote>\n<p>The answer is yes!<\/p>\n<h2>JSONID to PRONOM<\/h2>\n<p>This is described in more detail on the <a href=\"https:\/\/github.com\/ffdev-info\/jsonid#jsonid-for-pronom-signature-development\" target=\"_blank\" rel=\"noopener\">GitHub repository<\/a>, but given our example snippet above we can use JSONID&#8217;s companion tool on our example above as follows:<\/p>\n<pre>python json2pronom.py --path json_id_blog\/patterns_example.json\r\n<\/pre>\n<p>And a its output looks as follows:<\/p>\n<pre>&lt;?xml version=\"1.0\" ?&gt;\r\n&lt;FFSignatureFile xmlns=\"http:\/\/www.nationalarchives.gov.uk\/pronom\/SignatureFile\" Version=\"1\" DateCreated=\"2026-07-21T19:54:50Z\"&gt;\r\n  &lt;InternalSignatureCollection&gt;\r\n    &lt;InternalSignature ID=\"1\" Specificity=\"Specific\"&gt;\r\n      &lt;ByteSequence Reference=\"BOF\" Sequence=\"{0-4095}7B\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"226E616D6522{0-16}76616C7565\" MinOffset=\"\" MaxOffset=\"\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"22736368656D6122{0-16}3A{0-16}22*2F736368656D612F76657273696F6E2F312E312F*22\" MinOffset=\"\" MaxOffset=\"\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"226461746122{0-16}6D6F72652064617461\" MinOffset=\"\" MaxOffset=\"\"\/&gt;\r\n      &lt;ByteSequence Reference=\"EOF\" Sequence=\"7D{0-4095}\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n    &lt;\/InternalSignature&gt;\r\n    &lt;InternalSignature ID=\"2\" Specificity=\"Specific\"&gt;\r\n      &lt;ByteSequence Reference=\"BOF\" Sequence=\"{0-4095}7B00\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"22006E0061006D0065002200{0-16}760061006C0075006500\" MinOffset=\"\" MaxOffset=\"\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"220073006300680065006D0061002200{0-16}3A00{0-16}2200*2F0073006300680065006D0061002F00760065007200730069006F006E002F0031002E0031002F00*2200\" MinOffset=\"\" MaxOffset=\"\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"220064006100740061002200{0-16}6D006F007200650020006400610074006100\" MinOffset=\"\" MaxOffset=\"\"\/&gt;\r\n      &lt;ByteSequence Reference=\"EOF\" Sequence=\"7D00{0-4095}\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n    &lt;\/InternalSignature&gt;\r\n    &lt;InternalSignature ID=\"3\" Specificity=\"Specific\"&gt;\r\n      &lt;ByteSequence Reference=\"BOF\" Sequence=\"{0-4095}007B\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"0022006E0061006D00650022{0-16}00760061006C00750065\" MinOffset=\"\" MaxOffset=\"\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"00220073006300680065006D00610022{0-16}003A{0-16}0022*002F0073006300680065006D0061002F00760065007200730069006F006E002F0031002E0031002F*0022\" MinOffset=\"\" MaxOffset=\"\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"002200640061007400610022{0-16}006D006F0072006500200064006100740061\" MinOffset=\"\" MaxOffset=\"\"\/&gt;\r\n      &lt;ByteSequence Reference=\"EOF\" Sequence=\"007D{0-4095}\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n    &lt;\/InternalSignature&gt;\r\n    &lt;InternalSignature ID=\"4\" Specificity=\"Specific\"&gt;\r\n      &lt;ByteSequence Reference=\"BOF\" Sequence=\"{0-4095}7B000000\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"220000006E000000610000006D0000006500000022000000{0-16}76000000610000006C0000007500000065000000\" MinOffset=\"\" MaxOffset=\"\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"22000000730000006300000068000000650000006D0000006100000022000000{0-16}3A000000{0-16}22000000*2F000000730000006300000068000000650000006D000000610000002F00000076000000650000007200000073000000690000006F0000006E0000002F000000310000002E000000310000002F000000*22000000\" MinOffset=\"\" MaxOffset=\"\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"220000006400000061000000740000006100000022000000{0-16}6D0000006F00000072000000650000002000000064000000610000007400000061000000\" MinOffset=\"\" MaxOffset=\"\"\/&gt;\r\n      &lt;ByteSequence Reference=\"EOF\" Sequence=\"7D000000{0-4095}\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n    &lt;\/InternalSignature&gt;\r\n  &lt;\/InternalSignatureCollection&gt;\r\n  &lt;FileFormatCollection&gt;\r\n    &lt;FileFormat ID=\"1\" Name=\"JSONID2PRONOM Conversion (UTF-8)\" PUID=\"jsonid2pronom\/1\" Version=\"\" MIMEType=\"application\/json\" FormatType=\"structured text\"&gt;\r\n      &lt;InternalSignatureID&gt;1&lt;\/InternalSignatureID&gt;\r\n      &lt;Extension&gt;json&lt;\/Extension&gt;\r\n    &lt;\/FileFormat&gt;\r\n    &lt;FileFormat ID=\"2\" Name=\"JSONID2PRONOM Conversion (UTF-16)\" PUID=\"jsonid2pronom\/2\" Version=\"\" MIMEType=\"application\/json\" FormatType=\"structured text\"&gt;\r\n      &lt;InternalSignatureID&gt;2&lt;\/InternalSignatureID&gt;\r\n      &lt;Extension&gt;json&lt;\/Extension&gt;\r\n      &lt;HasPriorityOverFileFormatID&gt;1&lt;\/HasPriorityOverFileFormatID&gt;\r\n    &lt;\/FileFormat&gt;\r\n    &lt;FileFormat ID=\"3\" Name=\"JSONID2PRONOM Conversion (UTF-16BE)\" PUID=\"jsonid2pronom\/3\" Version=\"\" MIMEType=\"application\/json\" FormatType=\"structured text\"&gt;\r\n      &lt;InternalSignatureID&gt;3&lt;\/InternalSignatureID&gt;\r\n      &lt;Extension&gt;json&lt;\/Extension&gt;\r\n      &lt;HasPriorityOverFileFormatID&gt;2&lt;\/HasPriorityOverFileFormatID&gt;\r\n      &lt;HasPriorityOverFileFormatID&gt;1&lt;\/HasPriorityOverFileFormatID&gt;\r\n    &lt;\/FileFormat&gt;\r\n    &lt;FileFormat ID=\"4\" Name=\"JSONID2PRONOM Conversion (UTF-32LE)\" PUID=\"jsonid2pronom\/4\" Version=\"\" MIMEType=\"application\/json\" FormatType=\"structured text\"&gt;\r\n      &lt;InternalSignatureID&gt;4&lt;\/InternalSignatureID&gt;\r\n      &lt;Extension&gt;json&lt;\/Extension&gt;\r\n      &lt;HasPriorityOverFileFormatID&gt;2&lt;\/HasPriorityOverFileFormatID&gt;\r\n      &lt;HasPriorityOverFileFormatID&gt;3&lt;\/HasPriorityOverFileFormatID&gt;\r\n      &lt;HasPriorityOverFileFormatID&gt;1&lt;\/HasPriorityOverFileFormatID&gt;\r\n    &lt;\/FileFormat&gt;\r\n  &lt;\/FileFormatCollection&gt;\r\n&lt;\/FFSignatureFile&gt;\r\n<\/pre>\n<p>A PRONOM signature containing:<\/p>\n<ul>\n<li>Consistent beginning of file (BOF) and end of file (EOF) offsets.<\/li>\n<li>Consistent encoding of whitespace.<\/li>\n<li>Outputs for multiple different encodings including UTF-16 and UTF-32.<\/li>\n<li>Variably positioned keys where keys can appear anywhere in the JSON map without changing the document type.<\/li>\n<\/ul>\n<h2>What does this mean for you?<\/h2>\n<p>JSONID can already <a href=\"https:\/\/github.com\/ffdev-info\/jsonid\/blob\/184be5a1cd7277cbeab669ab7a8b8a89bbd2ecb3\/pronom_reference\/DROID_JSONID_SignatureFile.xml\" target=\"_blank\" rel=\"noopener\">output the majority of its 85 signature patterns<\/a> to PRONOM.<\/p>\n<p>JSONID will also output consistent baseline sequences for basic JSON identification.<\/p>\n<p>Using the companion utility I have described above, if YOU are trying to write JSON based signatures, you can consider writing them first in JSONID&#8217;s basic syntax, and output strong, variably encoded PRONOM signatures as a by-product.<\/p>\n<p>You can focus on identifying the important structure of your JSON documents and JSONID can do the heavy lifting and output PRONOM signatures for you to select and test and submit to the PRONOM team.<\/p>\n<p>Declarative all the way down. We&#8217;ve successfully built PRONOM from JSONID.<\/p>\n<h3>A prototype open for discussion<\/h3>\n<p>JSONID will output suggested defaults for baseline JSON identification e.g. UTF-8:<\/p>\n<pre>    &lt;InternalSignature ID=\"0\" Specificity=\"Specific\"&gt;\r\n      &lt;ByteSequence Reference=\"BOF\" Sequence=\"{0-4095}(7B|5B)\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"22{0-16}3A\" MinOffset=\"0\" MaxOffset=\"0\"\/&gt;\r\n      &lt;ByteSequence Reference=\"EOF\" Sequence=\"(7D|5D){0-4095}\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n    &lt;\/InternalSignature&gt;\r\n    &lt;InternalSignature ID=\"0\" Specificity=\"Specific\"&gt;\r\n      &lt;ByteSequence Reference=\"BOF\" Sequence=\"{0-4095}(7B|5B)\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"[30:39]\" MinOffset=\"0\" MaxOffset=\"0\"\/&gt;\r\n      &lt;ByteSequence Reference=\"EOF\" Sequence=\"(7D|5D){0-4095}\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n    &lt;\/InternalSignature&gt;\r\n    &lt;InternalSignature ID=\"0\" Specificity=\"Specific\"&gt;\r\n      &lt;ByteSequence Reference=\"BOF\" Sequence=\"{0-4095}(7B|5B)\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"(74727565|66616C7365)\" MinOffset=\"0\" MaxOffset=\"0\"\/&gt;\r\n      &lt;ByteSequence Reference=\"EOF\" Sequence=\"(7D|5D){0-4095}\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n    &lt;\/InternalSignature&gt;\r\n    &lt;InternalSignature ID=\"0\" Specificity=\"Specific\"&gt;\r\n      &lt;ByteSequence Reference=\"BOF\" Sequence=\"{0-4095}(7B|5B)\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"6E756C6C\" MinOffset=\"0\" MaxOffset=\"0\"\/&gt;\r\n      &lt;ByteSequence Reference=\"EOF\" Sequence=\"(7D|5D){0-4095}\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n    &lt;\/InternalSignature&gt;\r\n<\/pre>\n<p>And UTF-16:<\/p>\n<pre>    &lt;InternalSignature ID=\"0\" Specificity=\"Specific\"&gt;\r\n      &lt;ByteSequence Reference=\"BOF\" Sequence=\"{0-4095}(7B00|5B00)\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"2200{0-16}3A00\" MinOffset=\"0\" MaxOffset=\"0\"\/&gt;\r\n      &lt;ByteSequence Reference=\"EOF\" Sequence=\"(7D00|5D00){0-4095}\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n    &lt;\/InternalSignature&gt;\r\n    &lt;InternalSignature ID=\"0\" Specificity=\"Specific\"&gt;\r\n      &lt;ByteSequence Reference=\"BOF\" Sequence=\"{0-4095}(7B00|5B00)\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"[30:39]\" MinOffset=\"0\" MaxOffset=\"0\"\/&gt;\r\n      &lt;ByteSequence Reference=\"EOF\" Sequence=\"(7D00|5D00){0-4095}\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n    &lt;\/InternalSignature&gt;\r\n    &lt;InternalSignature ID=\"0\" Specificity=\"Specific\"&gt;\r\n      &lt;ByteSequence Reference=\"BOF\" Sequence=\"{0-4095}(7B00|5B00)\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"(7400720075006500|660061006C0073006500)\" MinOffset=\"0\" MaxOffset=\"0\"\/&gt;\r\n      &lt;ByteSequence Reference=\"EOF\" Sequence=\"(7D00|5D00){0-4095}\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n    &lt;\/InternalSignature&gt;\r\n    &lt;InternalSignature ID=\"0\" Specificity=\"Specific\"&gt;\r\n      &lt;ByteSequence Reference=\"BOF\" Sequence=\"{0-4095}(7B00|5B00)\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n      &lt;ByteSequence Reference=\"VAR\" Sequence=\"6E0075006C006C00\" MinOffset=\"0\" MaxOffset=\"0\"\/&gt;\r\n      &lt;ByteSequence Reference=\"EOF\" Sequence=\"(7D00|5D00){0-4095}\" MinOffset=\"0\" MaxOffset=\"4095\"\/&gt;\r\n    &lt;\/InternalSignature&gt;\r\n<\/pre>\n<p>Baseline JSON suggestions differ from the signature development workflow described above. The primary approach is that JSONID will build PRONOM signatures based solely on the data you describe. Baseline JSON patterns are designed as a catch-all for all JSON documents, and these have a lower identification priority (or weighting) compared to more specific JSON document types.<\/p>\n<p>The defaults may or may not be optimal and I hope that the continuing conversation about this utility will open these lines of discussion perhaps allowing a broader number of the signature development community to find consensus and sensible default settings.<\/p>\n<p>Feel free to engage in this discussion via <a href=\"https:\/\/github.com\/ffdev-info\/jsonid\" target=\"_blank\" rel=\"noopener\">GitHub&#8217;s<\/a> Issues or Discussions.<\/p>\n<h2>Additional thoughts<\/h2>\n<h3>JPEG<\/h3>\n<p>JPEG is another example of a format on which a lot of other &#8220;formats&#8221; <a href=\"https:\/\/pronom.nationalarchives.gov.uk\/search?q=jpg\" target=\"_blank\" rel=\"noopener\">are based<\/a>. The <a href=\"https:\/\/github.com\/digital-preservation\/PRONOM_Research\/issues\/53\" target=\"_blank\" rel=\"noopener\">recent discussion<\/a> about extending the size of the end of file sequence demonstrates the importance of standardizing PRONOM signature encoding practices when dealing with pluralistic base formats. A standard PRONOM EOF sequence should probably be applied to all formats in PRONOM that use the JPEG (or JPEG File Interchange Format (JFIF)).<\/p>\n<h3>PRONOM research on this blog<\/h3>\n<p>The ability to write PRONOM based signatures from JSONID&#8217;s syntax has evolved out of my research into PRONOM&#8217;s alternative simplified signature syntax. The simplified syntax makes it easier to programmatically write PRONOM compatible XML.<\/p>\n<p>You can read more about this research in the articles below.<\/p>\n<blockquote class=\"wp-embedded-content\" data-secret=\"RGN15HqF4l\"><p><a href=\"https:\/\/exponentialdecay.co.uk\/blog\/simpledroid-completing-the-circle\/\">simpledroid: completing the loop<\/a><\/p><\/blockquote>\n<p><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u201csimpledroid: completing the loop\u201d \u2014 ross spencer :: exponentialdecay.digipres :: blog\" src=\"https:\/\/exponentialdecay.co.uk\/blog\/simpledroid-completing-the-circle\/embed\/#?secret=Djgf7IIVj3#?secret=RGN15HqF4l\" data-secret=\"RGN15HqF4l\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n<blockquote class=\"wp-embedded-content\" data-secret=\"nlYH7v3jvH\"><p><a href=\"https:\/\/exponentialdecay.co.uk\/blog\/making-droid-work-with-wikidata\/\">Making DROID work with Wikidata<\/a><\/p><\/blockquote>\n<p><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u201cMaking DROID work with Wikidata\u201d \u2014 ross spencer :: exponentialdecay.digipres :: blog\" src=\"https:\/\/exponentialdecay.co.uk\/blog\/making-droid-work-with-wikidata\/embed\/#?secret=lkgQx5gGok#?secret=nlYH7v3jvH\" data-secret=\"nlYH7v3jvH\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n<h3>PRONOM as Emoji<\/h3>\n<p>While you&#8217;re reading this blog don&#8217;t forget you can take a light-hearted look at PRONOM&#8217;s data through another of my side projects through the lens of Emoji. More about that in the article below.<\/p>\n<blockquote class=\"wp-embedded-content\" data-secret=\"6Jbwr2mdyQ\"><p><a href=\"https:\/\/exponentialdecay.co.uk\/blog\/file-formats-as-emoji-0xffae\/\">File formats as Emoji: 0xffae<\/a><\/p><\/blockquote>\n<p><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u201cFile formats as Emoji: 0xffae\u201d \u2014 ross spencer :: exponentialdecay.digipres :: blog\" src=\"https:\/\/exponentialdecay.co.uk\/blog\/file-formats-as-emoji-0xffae\/embed\/#?secret=pTOIeCV55y#?secret=6Jbwr2mdyQ\" data-secret=\"6Jbwr2mdyQ\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n<p>&nbsp;<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_3488\" class=\"pvc_stats total_only  \" data-element-id=\"3488\" style=\"\"><i class=\"pvc-stats-icon small\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>PRONOM signatures are a form of <a href=\"https:\/\/exponentialdecay.co.uk\/blog\/declarative-programming-for-digital-preservationists-nttw8\/\" target=\"_blank\" rel=\"noopener\">declarative language<\/a>, you describe the anticipated behavior in PRONOM&#8217;s regular expression syntax and tools like DROID, FIDO, and Siegfried will interpret those instructions and attempt to match them against different files to return a file format identification.<\/p>\n<p>Normally, you will write PRONOM signatures by hand but doing so for file formats based on other <a href=\"https:\/\/exponentialdecay.co.uk\/blog\/file-format-building-blocks-primitives-in-digital-preservation\/\" target=\"_blank\" rel=\"noopener\">file format building blocks<\/a> can lead to inconsistencies. Bertrand Caron previously also <a href=\"https:\/\/github.com\/ffdev-info\/wikidp-issues\/issues\/36\" target=\"_blank\" rel=\"noopener\">recognized this<\/a> in the XML formats that are described with PRONOM signatures on Wikidata.<\/p>\n<p>XML can use single quotes <code>'<\/code> (hex: <code>0x27<\/code>) and double quotes <code>\"<\/code> (hex: <code>0x22<\/code>) for attribute data, and so, do we make a PRONOM signature with multiple sequences anticipating the use of either?<\/p>\n<p>The answer is more often than not likely to be <em>yes<\/em>, because the appearance of these values are often helpful for identifying boundaries for strings that we know must exist.<\/p>\n<p>But the more file formats that we need to add to PRONOM that are based on foundational formats like XML, or JSON, or similar, the more inconsistencies will creep in, such as sequences that are looking specifically for one byte sequence over another.<\/p>\n<p>The issue extends further if file formats allow data to appear at the beginning of file, or we need to account for a variable amount of white-space, or we want to start thinking about multi-byte character encoding.<\/p>\n<p>We can, and in the XML issue described by myself and Caron, I think the recommendation is very much to create editorial standards for signatures for file formats based on other baseline, structured data formats like XML, JSON, YAML, and so on.<\/p>\n<p>And standards are well and good, but what if tooling could help us?<\/p>\n<p>For JSON this is exactly what I have tried to do in JSONID.<\/p>\n<p>What does this feature look like? And what does it get us? Let&#8217;s take a look.<\/p>\n<div class=\"link-more\"><a href=\"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &ldquo;Declarative all the way down: Building PRONOM signatures with JSONID&rdquo;<\/span>&hellip;<\/a><\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_3488\" class=\"pvc_stats total_only  \" data-element-id=\"3488\" style=\"\"><i class=\"pvc-stats-icon small\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"author":1,"featured_media":3494,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[3,169],"tags":[352,147,71,15,520,191,17,335,347,519,349,351,16,340,334,185,516,521,518,517],"class_list":["post-3488","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-digital-preservation","category-talks","tag-declarative-programming","tag-digipres","tag-digital-preservation","tag-droid","tag-fido","tag-file-format-identification","tag-file-formats","tag-json","tag-jsonid","tag-jsonl","tag-nttw","tag-nttw9","tag-pronom","tag-rdm","tag-research-data","tag-siegfried","tag-structured-data","tag-structured-text","tag-toml","tag-yaml","entry"],"a3_pvc":{"activated":true,"total_views":14,"today_views":14},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Declarative all the way down: Building PRONOM signatures with JSONID - ross spencer :: exponentialdecay.digipres :: blog<\/title>\n<meta name=\"description\" content=\"A look at automating PRONOM signature development for JSON based file formats through JSONID&#039;s own declarative syntax.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Declarative all the way down: Building PRONOM signatures with JSONID - ross spencer :: exponentialdecay.digipres :: blog\" \/>\n<meta property=\"og:description\" content=\"A look at automating PRONOM signature development for JSON based file formats through JSONID&#039;s own declarative syntax.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/\" \/>\n<meta property=\"og:site_name\" content=\"ross spencer :: exponentialdecay.digipres :: blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-22T08:50:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2026\/07\/json_signature.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1123\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ross Spencer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@beet_keeper\" \/>\n<meta name=\"twitter:site\" content=\"@beet_keeper\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ross Spencer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/\"},\"author\":{\"name\":\"Ross Spencer\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/#\\\/schema\\\/person\\\/4cae0a954400f42b9c1b70c699837716\"},\"headline\":\"Declarative all the way down: Building PRONOM signatures with JSONID\",\"datePublished\":\"2026-07-22T08:50:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/\"},\"wordCount\":1076,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/#\\\/schema\\\/person\\\/4cae0a954400f42b9c1b70c699837716\"},\"image\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/json_signature.png\",\"keywords\":[\"declarative programming\",\"digipres\",\"Digital Preservation\",\"DROID\",\"FIDO\",\"File Format Identification\",\"File Formats\",\"JSON\",\"jsonid\",\"JSONL\",\"NTTW\",\"NTTW9\",\"PRONOM\",\"RDM\",\"Research Data\",\"siegfried\",\"Structured Data\",\"structured text\",\"TOML\",\"YAML\"],\"articleSection\":[\"Digital Preservation\",\"Talks\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/\",\"url\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/\",\"name\":\"Declarative all the way down: Building PRONOM signatures with JSONID - ross spencer :: exponentialdecay.digipres :: blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/json_signature.png\",\"datePublished\":\"2026-07-22T08:50:55+00:00\",\"description\":\"A look at automating PRONOM signature development for JSON based file formats through JSONID's own declarative syntax.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/#primaryimage\",\"url\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/json_signature.png\",\"contentUrl\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/json_signature.png\",\"width\":1123,\"height\":600,\"caption\":\"Example PRONOM signature built using JSONID's simplified syntax and standard encoding rules. The keys read PRONOM FROM JSONID\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Declarative all the way down: Building PRONOM signatures with JSONID\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/\",\"name\":\"ross spencer :: exponentialdecay.digipres :: blog\",\"description\":\"Digital preservation analyst, researcher, and software developer\",\"publisher\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/#\\\/schema\\\/person\\\/4cae0a954400f42b9c1b70c699837716\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/#\\\/schema\\\/person\\\/4cae0a954400f42b9c1b70c699837716\",\"name\":\"Ross Spencer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/avatar-scaled.png\",\"url\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/avatar-scaled.png\",\"contentUrl\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/avatar-scaled.png\",\"width\":2560,\"height\":2560,\"caption\":\"Ross Spencer\"},\"logo\":{\"@id\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/avatar-scaled.png\"},\"description\":\"Digital preservation domain expert and full-stack software developer.\",\"sameAs\":[\"http:\\\/\\\/www.exponentialdecay.co.uk\\\/blog\",\"https:\\\/\\\/www.instagram.com\\\/b33tk33p3r\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/ross-spencer-b6b9b758\\\/\",\"https:\\\/\\\/x.com\\\/beet_keeper\"],\"url\":\"https:\\\/\\\/exponentialdecay.co.uk\\\/blog\\\/author\\\/exponentialdecay\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Declarative all the way down: Building PRONOM signatures with JSONID - ross spencer :: exponentialdecay.digipres :: blog","description":"A look at automating PRONOM signature development for JSON based file formats through JSONID's own declarative syntax.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/","og_locale":"en_US","og_type":"article","og_title":"Declarative all the way down: Building PRONOM signatures with JSONID - ross spencer :: exponentialdecay.digipres :: blog","og_description":"A look at automating PRONOM signature development for JSON based file formats through JSONID's own declarative syntax.","og_url":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/","og_site_name":"ross spencer :: exponentialdecay.digipres :: blog","article_published_time":"2026-07-22T08:50:55+00:00","og_image":[{"width":1123,"height":600,"url":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2026\/07\/json_signature.png","type":"image\/png"}],"author":"Ross Spencer","twitter_card":"summary_large_image","twitter_creator":"@beet_keeper","twitter_site":"@beet_keeper","twitter_misc":{"Written by":"Ross Spencer","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/#article","isPartOf":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/"},"author":{"name":"Ross Spencer","@id":"https:\/\/exponentialdecay.co.uk\/blog\/#\/schema\/person\/4cae0a954400f42b9c1b70c699837716"},"headline":"Declarative all the way down: Building PRONOM signatures with JSONID","datePublished":"2026-07-22T08:50:55+00:00","mainEntityOfPage":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/"},"wordCount":1076,"commentCount":2,"publisher":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/#\/schema\/person\/4cae0a954400f42b9c1b70c699837716"},"image":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/#primaryimage"},"thumbnailUrl":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2026\/07\/json_signature.png","keywords":["declarative programming","digipres","Digital Preservation","DROID","FIDO","File Format Identification","File Formats","JSON","jsonid","JSONL","NTTW","NTTW9","PRONOM","RDM","Research Data","siegfried","Structured Data","structured text","TOML","YAML"],"articleSection":["Digital Preservation","Talks"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/","url":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/","name":"Declarative all the way down: Building PRONOM signatures with JSONID - ross spencer :: exponentialdecay.digipres :: blog","isPartOf":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/#primaryimage"},"image":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/#primaryimage"},"thumbnailUrl":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2026\/07\/json_signature.png","datePublished":"2026-07-22T08:50:55+00:00","description":"A look at automating PRONOM signature development for JSON based file formats through JSONID's own declarative syntax.","breadcrumb":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/#primaryimage","url":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2026\/07\/json_signature.png","contentUrl":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2026\/07\/json_signature.png","width":1123,"height":600,"caption":"Example PRONOM signature built using JSONID's simplified syntax and standard encoding rules. The keys read PRONOM FROM JSONID"},{"@type":"BreadcrumbList","@id":"https:\/\/exponentialdecay.co.uk\/blog\/declarative-all-the-way-down-building-pronom-signatures-with-jsonid\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/exponentialdecay.co.uk\/blog\/"},{"@type":"ListItem","position":2,"name":"Declarative all the way down: Building PRONOM signatures with JSONID"}]},{"@type":"WebSite","@id":"https:\/\/exponentialdecay.co.uk\/blog\/#website","url":"https:\/\/exponentialdecay.co.uk\/blog\/","name":"ross spencer :: exponentialdecay.digipres :: blog","description":"Digital preservation analyst, researcher, and software developer","publisher":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/#\/schema\/person\/4cae0a954400f42b9c1b70c699837716"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/exponentialdecay.co.uk\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/exponentialdecay.co.uk\/blog\/#\/schema\/person\/4cae0a954400f42b9c1b70c699837716","name":"Ross Spencer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2025\/06\/avatar-scaled.png","url":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2025\/06\/avatar-scaled.png","contentUrl":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2025\/06\/avatar-scaled.png","width":2560,"height":2560,"caption":"Ross Spencer"},"logo":{"@id":"https:\/\/exponentialdecay.co.uk\/blog\/wp-content\/uploads\/2025\/06\/avatar-scaled.png"},"description":"Digital preservation domain expert and full-stack software developer.","sameAs":["http:\/\/www.exponentialdecay.co.uk\/blog","https:\/\/www.instagram.com\/b33tk33p3r\/","https:\/\/www.linkedin.com\/in\/ross-spencer-b6b9b758\/","https:\/\/x.com\/beet_keeper"],"url":"https:\/\/exponentialdecay.co.uk\/blog\/author\/exponentialdecay\/"}]}},"views":46,"_links":{"self":[{"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/posts\/3488","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/comments?post=3488"}],"version-history":[{"count":16,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/posts\/3488\/revisions"}],"predecessor-version":[{"id":3510,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/posts\/3488\/revisions\/3510"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/media\/3494"}],"wp:attachment":[{"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/media?parent=3488"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/categories?post=3488"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/exponentialdecay.co.uk\/blog\/wp-json\/wp\/v2\/tags?post=3488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}