简体   繁体   中英

Unmarshal JSON into struct

My issue is very small but very frustrating since I can't seem to get the answer. I am trying to access the JSON part of a response from Google Script. In Golang, I have managed to strip it down to this

map[@type:type.googleapis.com/google.apps.script.v1.ExecutionResponse result:[
{
    "id": 1,
    "casenumber": "Criminal Case 20 of 2012",
    "datedelivered": "2015-10-22T21:00:00.000Z",
    "judge": "George Matatia Abaleka Dulu",
    "court": "High Court",
    "location": "Garissa",
    "accused": "Abdi Sheikh Mohamed",
    "judgment": "The accused Abdi Sheikh Mohamed stands charged with the offence of murder contrary to Section 203 as read with Section 204 of the Penal Code.  The particulars of the offence are that on 8th May 2012 at Ifo Refugee camp, Lagdera District within Garissa County murdered Othon Ubang Alwal.  He has denied the charge."
},
{
    "id": 2,
    "casenumber": "Criminal Case 21 of 2012",
    "datedelivered": "2015-11-22T21:00:00.000Z",
    "judge": "Lilo",
    "court": "High Court",
    "location": "Nairobi",
    "accused": "Stitch",
    "prosecution": "Milo",
    "judgment": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum"
}
]]

but I need to strip it down one level further by getting rid of

map[@type:type.googleapis.com/google.apps.script.v1.ExecutionResponse result:[

so I only have the results part.

So far I have tried unmarshalling it to my struct with no success. Here is the struct

type Case struct {
    ID int            
    CaseNumber string 
    DateDelivered string 
    Judge string 
    Court string 
    Location string                                   
    Accused string 
    Prosecution string 
    Judgment string
}

Any help will be highly appreciated.

EDIT: What I meant by the unmarshaling part is that when I try unmarshaling into my struct (even after fixing the struct) I get the error

json: cannot unmarshal object into Go value of type []Case

This is the code I need to get to work http://play.golang.org/p/rmsvfPVx52 .

You need to export the fields in Case by starting the name with an uppercase character.

type Case struct {
  ID int            
  CaseNumber string 
  DateDelivered string 
  Judge string 
  Court string 
  Location string                                   
  Accused string 
  Prosecution string 
  Judgment string
}

The encoding/json package and similar packages ignore unexported fields.

Use a slice to decode a JSON array:

  var result []Case
  err := json.Unmarshal(data, &result)
  if err != nil {
     // handle error
  }

Playground Example

Where c is

map[@type:type.googleapis.com/google.apps.script.v1.ExecutionResponse result:[
{
"id": 1,
"casenumber": "Criminal Case 20 of 2012",
"datedelivered": "2015-10-22T21:00:00.000Z",
"judge": "George Matatia Abaleka Dulu",
"court": "High Court",
"location": "Garissa",
"accused": "Abdi Sheikh Mohamed",
"judgment": "The accused Abdi Sheikh Mohamed stands charged with the offence of murder contrary to Section 203 as read with Section 204 of the Penal Code.  The particulars of the offence are that on 8th May 2012 at Ifo Refugee camp, Lagdera District within Garissa County murdered Othon Ubang Alwal.  He has denied the charge."
},
{
"id": 2,
"casenumber": "Criminal Case 21 of 2012",
"datedelivered": "2015-11-22T21:00:00.000Z",
"judge": "Lilo",
"court": "High Court",
"location": "Nairobi",
"accused": "Stitch",
"prosecution": "Milo",
"judgment": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum"
}
]]

I did;

case:= c.(map[string]interface {})
fmt.Println(case["result"])

which gives;

[
{
    "id": 1,
    "casenumber": "Criminal Case 20 of 2012",
    "datedelivered": "2015-10-22T21:00:00.000Z",
    "judge": "George Matatia Abaleka Dulu",
    "court": "High Court",
    "location": "Garissa",
    "accused": "Abdi Sheikh Mohamed",
    "judgment": "The accused Abdi Sheikh Mohamed stands charged with the offence of murder contrary to Section 203 as read with Section 204 of the Penal Code.  The particulars of the offence are that on 8th May 2012 at Ifo Refugee camp, Lagdera District within Garissa County murdered Othon Ubang Alwal.  He has denied the charge."
},
{
    "id": 2,
    "casenumber": "Criminal Case 21 of 2012",
    "datedelivered": "2015-11-22T21:00:00.000Z",
    "judge": "Lilo",
    "court": "High Court",
    "location": "Nairobi",
    "accused": "Stitch",
    "prosecution": "Milo",
    "judgment": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum"
}
]

As @CodingPickle indicated above, you need to strip the non-valid json first:

data := `{"result":[
{
    "id": 1,
    ...
},
{
    "id": 2,
    ...
}]}`

As well, you need to add the json defn's to the struct:

type Result struct {
    Result []Case `json:"result"`
}

type Case struct {
    ID            int    `json:"id"`
    CaseNumber    string `json:"casenumber"`
    DateDelivered string `json:"datedelivered"`
    Judge         string `json:"judge"`
    Court         string `json:"court"`
    Location      string `json:"location"`
    Accused       string `json:"accused"`
    Prosecution   string `json:"prosecution"`
    Judgment      string `json:"judgement"`
}

Example:

http://play.golang.org/p/KUbDpSxMVI

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM