ohler55 / ojg

Optimized JSON for Go
MIT License
837 stars 50 forks source link

Feature Request: enable copy and move of jpath to other parts of hierarchy #170

Closed scr-oath closed 4 months ago

scr-oath commented 4 months ago

The use case we have is the need to pull up key/values in a subfield to a parent field (without deleting existing fields).

{
  "foo": "bar",
  "baz": "buz",
  "ext": {
    "abc": "def"
    "ghi": 123
  }
}

should be able to copy, move or merge ext to $ concisely and end up with:

{
  "foo": "bar",
  "baz": "buz",
  "abc": "def"
  "ghi": 123
}
ohler55 commented 4 months ago

Due to the various options needed to avoid overwriting top level elements that exist with the same name it's not really appropriate to put this in the ojg/jp package itself. If you are not worried about name collisions then something like this should do what you describe.

    data := oj.MustParseString(`{
  "foo": "bar",
  "baz": "buz",
  "ext": {
    "abc": "def"
    "ghi": 123
  }
}
`)
    flat := map[string]any{}
    jp.Walk(data, func(path Expr, value any) {
        if c, ok := path[len(path)-1].(jp.Child); ok {
            flat[string(c)] = value
        }
    }, true)
ohler55 commented 4 months ago

With both jp.Locate() and jp.Walk() functions available it should be easy enough to make a custom function for flattening.

Since there has been no response or activity here for 2 weeks, this issue will be closed.