Json: Cannot Unmarshal Object into Go Value of Type

I can't decode the json code below ... any ideas why it doesn't work ? See also play.golang

package main
    
import (
    "encoding/json"         
)
    
type LocationReadable struct {
    District string
    City     string
    State    string
}
    
type Locale struct {
    Location         string
    CountryCode      string
    CurrencyId       string
    CurrencySymbol   string
    LocationReadable LocationReadable
}
    
type Media struct {
    Image string
    Video string
}
    
type Variations struct {
    FixedPrice float64
    Media      Media
    Quantity   int
}
    
type PaymentData struct {
    PaymentName    string
    PaymentService string
}
    
type Payment struct {
    Online  PaymentData
    Offline PaymentData
}
    
type Shipping struct {
    ShippingService        string
    ShippingName           string
    ShippingCost           float64
    HandlingTimeMax        int
    DispatchTimeMin        int
    DispatchTimeMax        int
    ShippingAdditionalCost int
}

type Item []struct {
    _version    string
    CategoryId  string
    Title       string
    Media       Media
    SellerId    string
    Locale      Locale
    ListingType string
    Payment     Payment
    StartTime   string
    EndTime     string
    Shipping    Shipping
    TitleSlug   string
    Variations  Variations
    _fpaiStatus string
}

func main() {
    itemInfoR := `{"locale":{"location":"51.51121389999999,-0.11982439999997041","countryCode":"GB","currencyId":"GBP","currencySymbol":"£","locationReadable":{"district":"City of Westminster","city":"London","state":"Greater London"}},"_version":"serving","categoryId":["Root","Cameras \u0026 Photo","Digital Cameras"],"title":"many pictures","media":{"image":["//","//","//","//","//","//","//","//","//","//","//","//","//","//","//","//","//","//","//","//","//","//","//","//","//","//"],"video":[]},"sellerId":"mihai","listingType":"fixedPrice","payment":{"online":[{"paymentName":"PayPal","paymentService":"paypal"}],"offline":[{"paymentName":"Pay on Pick-up","paymentService":"payOnPickup"}]},"startTime":"2014-01-04T10:02:18+00:00","endTime":"2014-04-04T10:02:18+00:00","shipping":[{"shippingService":"economy","shippingName":"Economy","shippingCost":1.0,"handlingTimeMax":4,"dispatchTimeMin":1,"dispatchTimeMax":10,"shippingAdditionalCost":"2"},{"shippingService":"localPickup","shippingName":"Local Pick-Up","shippingCost":0.0,"handlingTimeMax":2,"dispatchTimeMin":0,"dispatchTimeMax":0,"shippingAdditionalCost":"0"}],"titleSlug":"many-pictures","variations":[{"fixedPrice":222999.0,"media":{"image":["//","//","//"],"video":[]},"quantity":1121,"Brand":"Bell \u0026 Howell"},{"fixedPrice":211.0,"media":{"image":["//","//","//","//"],"video":[]},"quantity":2,"Brand":"Fujifilm"},{"fixedPrice":22.0,"media":{"image":["//","//","//"],"video":[]},"quantity":12,"Brand":"Gateway"}],"_fpaiStatus":"published"}`
    itemInfoBytes := []byte(itemInfoR)
    var ItemInfo Item
    er := json.Unmarshal(itemInfoBytes, &ItemInfo)
    if er != nil {
        panic(er)
    }
        
}
3

6 Answers

Here's a fixed version of it:

The biggest fix that was needed is when Unmarshalling an array, that property needs to be an array/slice in the struct as well.

For example:

{ "things": ["a", "b", "c"] }

Would Unmarshal into a:

type Item struct {
    Things []string
}

And not into:

type Item struct {
    Things string
}

The other thing to watch out for when Unmarshaling is that the types line up exactly. It will fail when Unmarshalling a JSON string representation of a number into an int or float field -- "1" needs to Unmarshal into a string, not into an int like we saw with ShippingAdditionalCost int

Determining of root cause is not an issue since Go 1.8; field name now is shown in the error message:

json: cannot unmarshal object into Go struct field Comment.author of type string
1

You JSON doesn't match your struct fields: E.g. "district" in JSON and "District" as the field.

Also: Your Item is a slice type but your JSON is a dict value. Do not mix this up. Slices decode from arrays.

2

Just in case you're looking for an answer to this from an AWS perspective, particularly if you're trying to use UnmarshalListOfMaps() on the items coming back from a DynamoDB query(), then watch out for a simple typo I made.

Given that this function UnmarshalListOfMaps() takes in...a list of maps :-) then it needs to unmarshal into a List of whatever struct you're trying to build, and not just the plain struct itself. This was throwing me off because I was trying to start by querying for something that should only return one row.

movie := Movie{}
// Run the DynamoDB query
resp, err := session.Query(input)  // type QueryInput
if err != nil {
    log.WithError(err).Error("Error running DynamoDB query")
}
// Unmarshal all the attribute values into a Movie struct
err = dynamodbattribute.UnmarshalListOfMaps(resp.Items, &movie); if err != nil {
    log.WithError(err).Error("Error marshaling DynamoDB result into Movie")
    return link, err
}

The problem is in the first line. It should be movies := []Movie{} and then the reference &movie needs to change to &movies as well. If you leave it just as it is above, then the AWS Go SDK will throw this error:

cannot unmarshal list into Go value of type (etc).

If you ever face this while typing yml file not copy-pasting, it might be a problem with your yml file - mine was wrong indent. This happened while making pipeline on concourse.

The problem with me that i was using Timstamp in grpc specification and trying to send

grpcurl -d="{\"startDate\":{\"seconds\":\"1645237120\"},\"endDate\":{\"seconds\":\"1645937120\"},\"vin\":\"JH4DB1561NS000569\",\"customerId\":\"CUST12345\"}" -plaintext localhost:50051 

i was getting that error

error getting request data: json: cannot unmarshal object into Go value of type string

when i change the time format to following: has solved the issue


grpcurl -d="{\"startDate\":\"2022-02-19T00:00:00Z\",\"endDate\":\"2022-02-20T00:00:00Z\",\"vin\":\"JH4DB1561NS000569\",\"customerId\":\"CUST12345\"}" -plaintext localhost:50051 

Your Answer

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

Chloe Bennett

Chloe Bennett

Culture, Media & Entertainment Columnist

Chloe Bennett explores the intersection of pop culture, streaming entertainment, digital trends, and contemporary lifestyle. Her weekly commentary reaches thousands of culture enthusiasts.

Share this article
Twitter Facebook Pinterest