Unmarshalling Arbitrary Data with JSON and Go
You have a specific requirement: unmarshalling JSON data in a way that allows you to process it in parts or sections. To achieve this, you're envisioning a structure where the first half of the data, or "code," indicates how to interpret the second half. Two potential structs for the second half are Range and User.
The Challenge
The existing json package in Go provides convenient functions for marshalling and unmarshalling defined structs, but it doesn't cater to your need for arbitrary data.
Decoding the Solution
The solution involves introducing a json.RawMessage field (Payload) in your Message struct. This field allows you to delay parsing the data until you know the code specified in the first half.
Here's an example implementation in Go:
<code class="go">type Message struct { Code int Payload json.RawMessage } type Range struct { Start int End int } type User struct { ID int Pass int } // Custom unmarshalling function func MyUnmarshall(m []byte) { var message Message json.Unmarshal(m, &message) var payload interface{} switch message.Code { case 3: payload = new(User) case 4: payload = new(Range) } json.Unmarshal(message.Payload, payload) }</code>
Usage
You would use this solution by first unmarshalling the "top half" using the json.Unmarshal function. Then, based on the code retrieved from the "top half," you would unmarshall the "bottom half" using the json.Unmarshal function again, this time providing the target json.RawMessage object.
Example
<code class="go">json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`) MyUnmarshall(json) // This will decode the data into a Range object</code>
Considerations
This technique allows you to handle arbitrary data unmarshalling in a structured and flexible manner. However, it introduces a runtime dependency on knowing the code upfront and the existence of matching structs for different codes.
The above is the detailed content of How to Unmarshall Arbitrary JSON Data in Go with a Dynamic Code-Driven Schema?. For more information, please follow other related articles on the PHP Chinese website!