--- title: transform.Unmarshal description: Parses serialized data and returns a map or an array. Supports CSV, JSON, TOML, YAML, and XML. categories: [] keywords: [] action: aliases: [unmarshal] related: - functions/transform/Remarshal - functions/resources/Get - functions/resources/GetRemote - functions/encoding/Jsonify returnType: any signatures: ['transform.Unmarshal [OPTIONS] INPUT'] toc: true aliases: [/functions/transform.unmarshal] --- The input can be a string or a [resource]. ## Unmarshal a string ```go-html-template {{ $string := ` title: Les Misérables author: Victor Hugo `}} {{ $book := unmarshal $string }} {{ $book.title }} → Les Misérables {{ $book.author }} → Victor Hugo ``` ## Unmarshal a resource Use the `transform.Unmarshal` function with global, page, and remote resources. ### Global resource A global resource is a file within the assets directory, or within any directory mounted to the assets directory. ```text assets/ └── data/ └── books.json ``` ```go-html-template {{ $data := "" }} {{ $path := "data/books.json" }} {{ with resources.Get $path }} {{ with unmarshal . }} {{ $data = . }} {{ end }} {{ else }} {{ errorf "Unable to get global resource %q" $path }} {{ end }} {{ range where $data "author" "Victor Hugo" }} {{ .title }} → Les Misérables {{ end }} ``` ### Page resource A page resource is a file within a [page bundle]. ```text content/ ├── post/ │ └── book-reviews/ │ ├── books.json │ └── index.md └── _index.md ``` ```go-html-template {{ $data := "" }} {{ $path := "books.json" }} {{ with .Resources.Get $path }} {{ with unmarshal . }} {{ $data = . }} {{ end }} {{ else }} {{ errorf "Unable to get page resource %q" $path }} {{ end }} {{ range where $data "author" "Victor Hugo" }} {{ .title }} → Les Misérables {{ end }} ``` ### Remote resource A remote resource is a file on a remote server, accessible via HTTP or HTTPS. ```go-html-template {{ $data := "" }} {{ $url := "https://example.org/books.json" }} {{ with resources.GetRemote $url }} {{ with .Err }} {{ errorf "%s" . }} {{ else }} {{ $data = . | transform.Unmarshal }} {{ end }} {{ else }} {{ errorf "Unable to get remote resource %q" $url }} {{ end }} {{ range where $data "author" "Victor Hugo" }} {{ .title }} → Les Misérables {{ end }} ``` [resource]: /getting-started/glossary/#resource [page bundle]: /content-management/page-bundles ## Options When unmarshaling a CSV file, provide an optional map of options. delimiter : (`string`) The delimiter used, default is `,`. comment : (`string`) The comment character used in the CSV. If set, lines beginning with the comment character without preceding whitespace are ignored. lazyQuotes {{< new-in 0.122.0 >}} : (`bool`) If true, a quote may appear in an unquoted field and a non-doubled quote may appear in a quoted field. Default is `false`. ```go-html-template {{ $csv := "a;b;c" | transform.Unmarshal (dict "delimiter" ";") }} ``` ## Working with XML When unmarshaling an XML file, do not include the root node when accessing data. For example, after unmarshaling the RSS feed below, access the feed title with `$data.channel.title`. ```xml Books on Example Site https://example.org/books/ Recent content in Books on Example Site en-US The Hunchback of Notre Dame Written by Victor Hugo https://example.org/books/the-hunchback-of-notre-dame/ Mon, 09 Oct 2023 09:27:12 -0700 https://example.org/books/the-hunchback-of-notre-dame/ Les Misérables Written by Victor Hugo https://example.org/books/les-miserables/ Mon, 09 Oct 2023 09:27:11 -0700 https://example.org/books/les-miserables/ ``` Get the remote data: ```go-html-template {{ $data := "" }} {{ $url := "https://example.org/books/index.xml" }} {{ with resources.GetRemote $url }} {{ with .Err }} {{ errorf "%s" . }} {{ else }} {{ $data = . | transform.Unmarshal }} {{ end }} {{ else }} {{ errorf "Unable to get remote resource %q" $url }} {{ end }} ``` Inspect the data structure: ```go-html-template
{{ jsonify (dict "indent" "  ") $data }}
``` List the book titles: ```go-html-template {{ with $data.channel.item }} {{ end }} ``` Hugo renders this to: ```html ``` ### XML attributes and namespaces Let's add a `lang` attribute to the `title` nodes of our RSS feed, and a namespaced node for the ISBN number: ```xml Books on Example Site https://example.org/books/ Recent content in Books on Example Site en-US The Hunchback of Notre Dame Written by Victor Hugo 9780140443530 https://example.org/books/the-hunchback-of-notre-dame/ Mon, 09 Oct 2023 09:27:12 -0700 https://example.org/books/the-hunchback-of-notre-dame/ Les Misérables Written by Victor Hugo 9780451419439 https://example.org/books/les-miserables/ Mon, 09 Oct 2023 09:27:11 -0700 https://example.org/books/les-miserables/ ``` After retrieving the remote data, inspect the data structure: ```go-html-template
{{ jsonify (dict "indent" "  ") $data }}
``` Each item node looks like this: ```json { "description": "Written by Victor Hugo", "guid": "https://example.org/books/the-hunchback-of-notre-dame/", "link": "https://example.org/books/the-hunchback-of-notre-dame/", "number": "9780140443530", "pubDate": "Mon, 09 Oct 2023 09:27:12 -0700", "title": { "#text": "The Hunchback of Notre Dame", "-lang": "fr" } } ``` The title keys do not begin with an underscore or a letter---they are not valid [identifiers]. Use the [`index`] function to access the values: ```go-html-template {{ with $data.channel.item }} {{ end }} ``` Hugo renders this to: ```html ``` [`index`]: /functions/collections/indexfunction [identifiers]: https://go.dev/ref/spec#Identifiers