Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proposal: encoding/json: Support for nested values in JSON tags #27366

Open
cblach opened this issue Aug 30, 2018 · 6 comments
Open

proposal: encoding/json: Support for nested values in JSON tags #27366

cblach opened this issue Aug 30, 2018 · 6 comments

Comments

@cblach
Copy link

cblach commented Aug 30, 2018

I have often run into situations where it would convenient to translate nested JSON objects into flat structs.

An example would be the AWS dynamodb API that returns nested objects based on the saved type (https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html), i.e.:

 {
    "Item": {
        "somekey": {
            "S": "somestr"
        }
    }
}

Lets say we know we saved "somekey" as a string.
Thus it would be convinient, if we could avoid the need for the nested structs:

package main
import(
	"encoding/json"
	"fmt"
)

var str = `
{
    "Item": {
        "somekey": {
            "S": "somestr"
        },
        "otherkey": {
        	"N": "123"
        }
    }
}
`

type Data struct {
	Somekey  string`json:"Item.somekey.S"`
	Otherkey uint64`json:"Item.otherkey.N,string"`
}

func main() {
	d := Data{}
	if err := json.Unmarshal([]byte(str), &d); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("Data struct:", d)
}

This allows one to get saner data structures with minimal code, where previously one would have to manually translate the structs to achieve this.

@gopherbot gopherbot added this to the Proposal milestone Aug 30, 2018
@meirf
Copy link
Contributor

meirf commented Oct 14, 2018

where previously one would have to manually translate the structs to achieve this.

Have you tried https://mholt.github.io/json-to-go? It's obviates the manual translation. Sure, it means you'll have more code in the form of the struct, but that doesn't sound like a concern for you.

If that tool is enough for you?

@rsc
Copy link
Contributor

rsc commented Oct 17, 2018

On hold for JSON sweep.

@WhileLoop
Copy link

WhileLoop commented Oct 17, 2019

where previously one would have to manually translate the structs to achieve this.

Have you tried https://mholt.github.io/json-to-go? It's obviates the manual translation. Sure, it means you'll have more code in the form of the struct, but that doesn't sound like a concern for you.

If that tool is enough for you?

This does not work in cases where one is forced to use a flat struct. For example, I am using sqlx to scan database columns into a struct, but want to encode the flat structure as nested JSON. Workaround is to manually map columns to nested nested struct members, but being able to tell the JSON encoder to created nested output using tags directly would be very handy.

@ian-fox
Copy link

ian-fox commented Oct 17, 2020

What is the JSON sweep? I've been meaning to write something like this for a while, either as a standalone package or contributing directly to go.

@dsnet
Copy link
Member

dsnet commented Nov 11, 2020

This seems like duplicate of #6213, or at least has significant overlap.

@felipearomani
Copy link

felipearomani commented Mar 5, 2024

It could support syntax for JSON Path, as I suggest in my duplicated proposal #66116.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

8 participants