9

I have a JSON document of Users where they have an ID#, Phone#, and Email. Upon input of another ID, Phone, and Email, I want to take a new user's information and append it to the file. I have a structure that only contains an {ID: #, Phone: #, Email: #} and that's working fine. But my JSON file becomes as such:

[{"ID":"ABCD","Phone":1234567890,"Email":"[email protected]"}]
[{"ID":"EFGH","Phone":1234567890,"Email":"[email protected]"}]
[{"ID":"IJKL","Phone":1234567890,"Email":"[email protected]"}]
[{"ID":"MNOP","Phone":1234567890,"Email":"[email protected]"}]
[{"ID":"QRST","Phone":1234567890,"Email":"[email protected]"}]
[{"ID":"UVWX","Phone":1234567890,"Email":"[email protected]"}]

So I'm able to append to the document, but it's a new JSON structure enclosed by brackets []. Below is my code. I omitted the actual hashed ID.

func ToIds(e string, p int64) {
    hashed := GenId()
    var jsonText = []byte(`[
        {"ID": "", "Phone": 0, "Email": ""}
    ]`)
    var I Identification
    err := json.Unmarshal([]byte(jsonText), &I)
    if err != nil {
        fmt.Println(err)
    }
    I[0].ID = hashed
    I[0].Phone = p
    I[0].Email = e

    result, error := json.Marshal(I)
    if error != nil {
        fmt.Println(error)
    }

    f, erro := os.OpenFile("FILE_PATH", os.O_APPEND|os.O_WRONLY, 0666)
    if erro != nil {
        fmt.Println(erro)
    }

    n, err := io.WriteString(f, string(result))
    if err != nil {
        fmt.Println(n, err)
    }

}

This may be of use, here is my Identification struct.

type Identification []struct { ID string Phone int64
Email string }

Essentially, I want the outside brackets, and inside those brackets I want to append multiple users. Something like this:

    [
    {"id":"A", "phone":17145555555, "email":"[email protected]"},
    {"id":"B","phone":15555555555,"email":"[email protected]"},
    {"id":"C","phone":14155555555,"email":"[email protected]"},
    {"id":"D","phone":17135555555,"email":"[email protected]"},
    {"id":"E","phone":17125555555,"email":"[email protected]"},
    {"id":"F","phone":17125555555,"email":"[email protected]"},
    {"id":"G","phone":14055555555,"email":"[email protected]"},
    {"id":"H","phone":13105555555,"email":"[email protected]"}
    ]

1 Answer 1

13

To achieve your output, define struct as follows-

type Identification struct {
   ID    string
   Phone int64
   Email string
}

And perform operation as follows-

// define slice of Identification
var idents []Identification

// Unmarshall it
err := json.Unmarshal([]byte(jsonText), &idents)

// add further value into it
idents = append(idents, Identification{ID: "ID", Phone: 15555555555, Email: "Email"})

// now Marshal it
result, error := json.Marshal(idents)

// now result has your targeted JSON structure

Sample program of above explanation https://play.golang.org/p/67dqOaCWHI

Sign up to request clarification or add additional context in comments.

5 Comments

The only reason I defined my struct in my manner was so that I could iterate through it by saying: for index := range Identification. How could I iterate through your structure? The reason for iteration is to make sure I'm not duplicating the user.
You can iterate idents value.
I'm sorry, what do you mean by iterating through "idents value"?
Refer to the play.golang link in the answer added iteration too.
Appreciate the help.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.