2019-10-21 04:22:28 -04:00
---
2023-05-22 10:43:12 -04:00
title: transform.Unmarshal
2023-12-04 09:14:18 -05:00
description: Parses serialized data and returns a map or an array. Supports CSV, JSON, TOML, YAML, and XML.
categories: []
2023-10-20 03:42:39 -04:00
keywords: []
2023-12-04 09:14:18 -05:00
action:
2023-10-20 03:42:39 -04:00
aliases: [unmarshal]
2023-12-04 09:14:18 -05:00
related:
- functions/transform/Remarshal
- functions/resources/Get
- functions/resources/GetRemote
- functions/encoding/Jsonify
2023-10-20 03:42:39 -04:00
returnType: any
2023-12-04 09:14:18 -05:00
signatures: ['transform.Unmarshal [OPTIONS] INPUT']
toc: true
2023-10-20 03:42:39 -04:00
aliases: [/functions/transform.unmarshal]
2019-10-21 04:22:28 -04:00
---
2023-12-04 09:14:18 -05:00
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
```
2019-10-21 04:22:28 -04:00
```go-html-template
2023-12-04 09:14:18 -05:00
{{ $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
2019-10-21 04:22:28 -04:00
```
```go-html-template
2023-12-04 09:14:18 -05:00
{{ $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 }}
2019-10-21 04:22:28 -04:00
```
2023-12-04 09:14:18 -05:00
### Remote resource
A remote resource is a file on a remote server, accessible via HTTP or HTTPS.
2019-10-21 04:22:28 -04:00
```go-html-template
2023-12-04 09:14:18 -05:00
{{ $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 }}
2019-10-21 04:22:28 -04:00
```
2023-12-04 09:14:18 -05:00
[resource]: /getting-started/glossary/#resource
[page bundle]: /content-management/page-bundles
2019-10-21 04:22:28 -04:00
2023-12-04 09:14:18 -05:00
## Options
2019-10-21 04:22:28 -04:00
2023-12-04 09:14:18 -05:00
When unmarshaling a CSV file, provide an optional map of options.
2019-10-21 04:22:28 -04:00
delimiter
2023-12-04 09:14:18 -05:00
: (`string`) The delimiter used, default is `,` .
2019-10-21 04:22:28 -04:00
comment
2023-12-04 09:14:18 -05:00
: (`string`) The comment character used in the CSV. If set, lines beginning with the comment character without preceding whitespace are ignored.
2019-10-21 04:22:28 -04:00
```go-html-template
{{ $csv := "a;b;c" | transform.Unmarshal (dict "delimiter" ";") }}
```
2021-12-13 15:04:12 -05:00
2023-12-04 09:14:18 -05:00
## Working with XML
2021-12-13 15:04:12 -05:00
2023-12-04 09:14:18 -05:00
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` .
2021-12-13 15:04:12 -05:00
2023-05-22 10:43:12 -04:00
```xml
2023-12-04 09:14:18 -05:00
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
< rss version = "2.0" xmlns:atom = "http://www.w3.org/2005/Atom" >
< channel >
< title > Books on Example Site< / title >
< link > https://example.org/books/< / link >
< description > Recent content in Books on Example Site< / description >
< language > en-US< / language >
< atom:link href = "https://example.org/books/index.xml" rel = "self" type = "application/rss+xml" / >
< item >
< title > The Hunchback of Notre Dame< / title >
< description > Written by Victor Hugo< / description >
< link > https://example.org/books/the-hunchback-of-notre-dame/< / link >
< pubDate > Mon, 09 Oct 2023 09:27:12 -0700< / pubDate >
< guid > https://example.org/books/the-hunchback-of-notre-dame/< / guid >
< / item >
< item >
< title > Les Misérables< / title >
< description > Written by Victor Hugo< / description >
< link > https://example.org/books/les-miserables/< / link >
< pubDate > Mon, 09 Oct 2023 09:27:11 -0700< / pubDate >
< guid > https://example.org/books/les-miserables/< / guid >
< / item >
< / channel >
< / rss >
2021-12-13 15:04:12 -05:00
```
2023-12-04 09:14:18 -05:00
Get the remote data:
2021-12-13 15:04:12 -05:00
2023-05-22 10:43:12 -04:00
```go-html-template
2023-12-04 09:14:18 -05:00
{{ $data := "" }}
{{ $url := "https://example.org/books/index.xml" }}
{{ with resources.GetRemote $url }}
{{ with .Err }}
{{ errorf "%s" . }}
{{ else }}
{{ $data = . | transform.Unmarshal }}
2023-08-07 04:35:12 -04:00
{{ end }}
2023-12-04 09:14:18 -05:00
{{ else }}
{{ errorf "Unable to get remote resource %q" $url }}
2021-12-13 15:04:12 -05:00
{{ end }}
```
2023-12-04 09:14:18 -05:00
Inspect the data structure:
```go-html-template
< pre > {{ jsonify (dict "indent" " ") $data }}< / pre >
```
List the book titles:
```go-html-template
{{ with $data.channel.item }}
< ul >
{{ range . }}
< li > {{ .title }}< / li >
{{ end }}
< / ul >
{{ end }}
```
Hugo renders this to:
```html
< ul >
< li > The Hunchback of Notre Dame< / li >
< li > Les Misérables< / li >
< / ul >
```
### 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
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
< rss version = "2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:isbn="http://schemas.isbn.org/ns/1999/basic.dtd"
>
< channel >
< title > Books on Example Site< / title >
< link > https://example.org/books/< / link >
< description > Recent content in Books on Example Site< / description >
< language > en-US< / language >
< atom:link href = "https://example.org/books/index.xml" rel = "self" type = "application/rss+xml" / >
< item >
< title lang = "fr" > The Hunchback of Notre Dame< / title >
< description > Written by Victor Hugo< / description >
< isbn:number > 9780140443530< / isbn:number >
< link > https://example.org/books/the-hunchback-of-notre-dame/< / link >
< pubDate > Mon, 09 Oct 2023 09:27:12 -0700< / pubDate >
< guid > https://example.org/books/the-hunchback-of-notre-dame/< / guid >
< / item >
< item >
< title lang = "en" > Les Misérables< / title >
< description > Written by Victor Hugo< / description >
< isbn:number > 9780451419439< / isbn:number >
< link > https://example.org/books/les-miserables/< / link >
< pubDate > Mon, 09 Oct 2023 09:27:11 -0700< / pubDate >
< guid > https://example.org/books/les-miserables/< / guid >
< / item >
< / channel >
< / rss >
```
After retrieving the remote data, inspect the data structure:
```go-html-template
< pre > {{ jsonify (dict "indent" " ") $data }}< / pre >
```
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 }}
< ul >
{{ range . }}
{{ $title := index .title "#text" }}
{{ $lang := index .title "-lang" }}
{{ $ISBN := .number }}
< li > {{ $title }} ({{ $lang }}) {{ $ISBN }}< / li >
{{ end }}
< / ul >
{{ end }}
```
Hugo renders this to:
```html
< ul >
< li > The Hunchback of Notre Dame (fr) 9780140443530< / li >
< li > Les Misérables (en) 9780451419439< / li >
< / ul >
```
[`index`]: /functions/collections/indexfunction
[identifiers]: https://go.dev/ref/spec#Identifiers