Home  >  Article  >  Backend Development  >  How to Unmarshall Arbitrary JSON Data in Go with a Dynamic Code-Driven Schema?

How to Unmarshall Arbitrary JSON Data in Go with a Dynamic Code-Driven Schema?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 08:22:30679browse

How to Unmarshall Arbitrary JSON Data in Go with a Dynamic Code-Driven Schema?

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn