-1

The below is my sample code in Go. I want to parse the value of B and check value of key 'status'

package main

import (
    "encoding/json"
    "fmt"
)

type ValidateUser struct {
    UserName, status, sessionID, timestamp string
}

func main() {
    // This JSON contains an int array.
    B := "{\"UserName\": \"Moulali\",\"status\": \"valid_user\"}"

    fmt.Println("outside if")
    fmt.Println("ValueOfB = %v", B)

    bytes := []byte(B)

    var validateUser ValidateUser
    json.Unmarshal(bytes, &validateUser)
    if validateUser.status == "valid_user" {
        fmt.Printf("Valid User")
    }
}
Jonathan Hall
  • 75,165
  • 16
  • 143
  • 189
Moulali
  • 465
  • 1
  • 6
  • 17
  • 4
    `status` should be exported. check this out: https://play.golang.org/p/NahMuLoWot0 – stevenferrer Apr 19 '18 at 06:14
  • 2
    Possible duplicate of [JSON and dealing with unexported fields](https://stackoverflow.com/questions/11126793/json-and-dealing-with-unexported-fields) – Jonathan Hall Apr 19 '18 at 07:25

2 Answers2

3

status should be exported (ValidateUser.Status). Just one slight modification to your code:

package main

import (
    "encoding/json"
    "fmt"
)

type ValidateUser struct {
    UserName string
    // export Status, and map to json field `status`
    Status string `json: "status"`
    sessionID string
    timestamp string
}

func main() {
    // This JSON contains an int array.
    B := "{\"UserName\": \"Moulali\",\"status\": \"valid_user\"}"

    fmt.Println("outside if")
    fmt.Println("ValueOfB = %v", B)

    bytes := []byte(B)

    var validateUser ValidateUser
    json.Unmarshal(bytes, &validateUser)

    // reference ValidateUser.Status (capital s)
    if validateUser.Status == "valid_user" {
        fmt.Printf("Valid User")
    }
}

Link to code: https://play.golang.org/p/WN4cOz_YBLF

ikr
  • 82
  • 4
0

json package methods can only deal with public fields. Here, status is a private field and it is not accessible form json.Marshal or json.Unmarshal.

If you want to have the field name as status, you can specify that in json tag.

See the example:

package main

import (
    "encoding/json"
    "fmt"
)

type ValidateUser struct {
    UserName             string `json:"UserName"`
    Status               string `json:"Status"`
    sessionID, timestamp string
}

func main() {
    // This JSON contains an int array.
    B := "{\"UserName\": \"Moulali\",\"status\": \"valid_user\"}"

    fmt.Println("outside if")
    fmt.Println("ValueOfB = %v", B)

    bytes := []byte(B)

    var validateUser ValidateUser
    json.Unmarshal(bytes, &validateUser)
    if validateUser.Status == "valid_user" {
        fmt.Printf("Valid User: %v \n", validateUser)

        jsonMarshalled, _ := json.Marshal(validateUser) //checking marshal
        fmt.Println(string(jsonMarshalled))
    }
}

Output:

outside if
ValueOfB = %v {"UserName": "Moulali","status": "valid_user"}
Valid User: {Moulali valid_user  } 
{"UserName":"Moulali","Status":"valid_user"}