Fix JSON array-based data file handling regression
authorVas Sudanagunta <vas@commonkarma.org>
Fri, 2 Feb 2018 06:35:26 +0000 (01:35 -0500)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 2 Feb 2018 08:14:37 +0000 (09:14 +0100)
This bug was introduced in Hugo 0.35.

Fixes #4361

hugolib/site.go
parser/frontmatter.go

index 0e5f034a463a4676d7a6dbb4e6c5adc66a1c4420..044866cca6648424b8cb5eddd2b512acdf994783 100644 (file)
@@ -804,7 +804,7 @@ func (s *Site) handleDataFile(r source.ReadableFile) error {
 
        data, err := s.readData(r)
        if err != nil {
-               s.Log.WARN.Printf("Failed to read data from %s: %s", filepath.Join(r.Path(), r.LogicalName()), err)
+               s.Log.ERROR.Printf("Failed to read data from %s: %s", filepath.Join(r.Path(), r.LogicalName()), err)
                return nil
        }
 
@@ -846,7 +846,7 @@ func (s *Site) readData(f source.ReadableFile) (interface{}, error) {
        case "yaml", "yml":
                return parser.HandleYAMLMetaData(content)
        case "json":
-               return parser.HandleJSONMetaData(content)
+               return parser.HandleJSONData(content)
        case "toml":
                return parser.HandleTOMLMetaData(content)
        default:
index 7560a734af672df47f325f92d9456d35d944602f..e9552a859b72d6a94b571ccc18cd371e9bdc8045 100644 (file)
@@ -207,6 +207,22 @@ func HandleYAMLMetaData(datum []byte) (map[string]interface{}, error) {
 // HandleJSONMetaData unmarshals JSON-encoded datum and returns a Go interface
 // representing the encoded data structure.
 func HandleJSONMetaData(datum []byte) (map[string]interface{}, error) {
+       m := make(map[string]interface{})
+
+       if datum == nil {
+               // Package json returns on error on nil input.
+               // Return an empty map to be consistent with our other supported
+               // formats.
+               return m, nil
+       }
+
+       err := json.Unmarshal(datum, &m)
+       return m, err
+}
+
+// HandleJSONData unmarshals JSON-encoded datum and returns a Go interface
+// representing the encoded data structure.
+func HandleJSONData(datum []byte) (interface{}, error) {
        if datum == nil {
                // Package json returns on error on nil input.
                // Return an empty map to be consistent with our other supported
@@ -214,7 +230,7 @@ func HandleJSONMetaData(datum []byte) (map[string]interface{}, error) {
                return make(map[string]interface{}), nil
        }
 
-       var f map[string]interface{}
+       var f interface{}
        err := json.Unmarshal(datum, &f)
        return f, err
 }