bytedance / sonic

A blazingly fast JSON serializing & deserializing library
Apache License 2.0
6.79k stars 333 forks source link

How to interpret single JSON object as an array with one element? #270

Closed cxjava closed 2 years ago

cxjava commented 2 years ago

In Sonic how to handle the json format like below with one struct?

Format A (JSON array with two element):

{"name":"xiao","address":["road1","road2"]}

Format B (JSON object, yes I know it looks "wrong" but it's what I'm given):

{"name":"xiao","address":"road1"}

Example code:

package main

import (
    "fmt"
    "strings"

    "github.com/bytedance/sonic/decoder"
)

type Person struct {
    Name    string
    Address []string
}

func testDecode1() {
    var o Person
    var r = strings.NewReader(`{"name":"xiao","address":["road1","road2"]}`)
    var dec = decoder.NewStreamDecoder(r)
    dec.Decode(&o)
    fmt.Printf("%+v\n", o) // {Name:xiao Address:[road1 road2]}
}

func testDecode2() {
    var o Person
    var r = strings.NewReader(`{"name":"xiao","address":"road1"}`)
    var dec = decoder.NewStreamDecoder(r)
    dec.Decode(&o)
    // expected resoult: {Name:xiao Address:[road1]}
    // actual resoult: {Name:xiao Address:[]}
    fmt.Printf("%+v\n", o)
}

func main() {
    testDecode1()
    testDecode2()
}

similar like : https://stackoverflow.com/questions/17003823/make-jackson-interpret-single-json-object-as-array-with-one-element

AsterDY commented 2 years ago

not supported by std. But u can implement a work-around logic through json.Unmarshaler: