github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/ioutil/json.go (about)

     1  // Copyright 2016 Keybase Inc. All rights reserved.
     2  // Use of this source code is governed by a BSD
     3  // license that can be found in the LICENSE file.
     4  
     5  package ioutil
     6  
     7  import (
     8  	"encoding/json"
     9  	"path/filepath"
    10  
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  // TODO: Support unknown fields (probably by using go-codec's JSON
    15  // serializer/deserializer).
    16  
    17  // SerializeToJSONFile serializes the given object as JSON and writes
    18  // it to the given file, making its parent directory first if
    19  // necessary.
    20  func SerializeToJSONFile(obj interface{}, path string) error {
    21  	err := MkdirAll(filepath.Dir(path), 0700)
    22  	if err != nil {
    23  		return err
    24  	}
    25  
    26  	buf, err := json.Marshal(obj)
    27  	if err != nil {
    28  		return errors.Wrapf(err, "failed to marshal %q as JSON", path)
    29  	}
    30  
    31  	return WriteFile(path, buf, 0600)
    32  }
    33  
    34  // DeserializeFromJSONFile deserializes the given JSON file into the
    35  // object pointed to by objPtr. It may return an error for which
    36  // ioutil.IsNotExist() returns true.
    37  func DeserializeFromJSONFile(path string, objPtr interface{}) error {
    38  	data, err := ReadFile(path)
    39  	if err != nil {
    40  		return err
    41  	}
    42  
    43  	err = json.Unmarshal(data, objPtr)
    44  	if err != nil {
    45  		return errors.Wrapf(err, "failed to unmarshal %q as JSON", path)
    46  	}
    47  
    48  	return nil
    49  }