The json is not very strict, while go is. It would be good if the json
struct could potentially be strictly of same type all over the place.
Implementing parser for this json in any language will be a bit of a pain
with some try/except...
If you really need to do so, you would need to have the Value as type
interface{} and then use Reflect to find out if it's a struct, or bool or
int and cast it accordingly to it's type. But really, would be easier if
the value field was uniform, no matter the language used.
So in other words:
1. unmarshal using interface
2. reflect to find type
3. cast to a new variable for the select type
type Autogenerated struct {
AllParameters []struct {
Priority int `json:"priority"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
ID int `json:"id"` Name string `json:"name"`
ParameterType string `json:"parameter_type"`
Value interface{} `json:"value"`
valueAsInt int
valueAsBool bool
valueAsMap map[string]interface{}
} `json:"all_parameters"`
}
Example here:
https://play.golang.org/p/PWHz_g_jabz
On Wednesday, 2 June 2021 at 14:15:50 UTC+1 [email protected] wrote:
> hi,
>
> I have this json back from an api:
>
> {
> "all_parameters": [{
> "priority": 60,
> "created_at": "2021-06-02 12:15:13 UTC",
> "updated_at": "2021-06-02 12:15:13 UTC",
> "id": 28,
> "name": "network_interface_mapping",
> "parameter_type": "yaml",
> "value": {
> "interface1": "eno1",
> "interface2": "eno2",
> "interface3": "eno3",
> "interface4": "eno4"
> }
> },
> {
> "priority": 60,
> "created_at": "2021-06-02 12:15:13 UTC",
> "updated_at": "2021-06-02 12:15:13 UTC",
> "id": 27,
> "name": "component_1",
> "parameter_type": "boolean",
> "value": true
> },
> {
> "priority": 50,
> "created_at": "2021-03-19 14:34:26 UTC",
> "updated_at": "2021-03-19 14:34:26 UTC",
> "id": 15,
> "name": "url1",
> "parameter_type": "string",
> "value": "http://www.example.org/1"
> }
> ]
> }
>
> If I use the json2go service, then it simplifies the values like this:
>
>
> type Autogenerated struct {
> AllParameters []struct {
> Priority int `json:"priority"`
> CreatedAt string `json:"created_at"`
> UpdatedAt string `json:"updated_at"`
> ID int `json:"id"` Name string `json:"name"`
> ParameterType string `json:"parameter_type"`
> Value struct {
> Interface1 string `json:"interface1"`
> Interface2 string `json:"interface2"`
> Interface3 string `json:"interface3"`
> Interface4 string `json:"interface4"`
> } `json:"value"`
> } `json:"all_parameters"`
> }
>
> so the value struct has the values of just the first parameter, in fact.
> The other parameters have different values, could be a boolean or a string.
>
> How can I use this in my client script? Unmarhalling into this struct type
> gives me obviously errors
>
> Error: json: cannot unmarshal object into Go struct field
> .all_parameters.value of type string
>
> Thanks in advance for your input.
>
> Regards,
> Natxo
>
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/e8e5d860-307c-4635-9629-c8fd43f8cff8n%40googlegroups.com.