处理动态字段时如何在 Go 中解组

问题描述

我正在学习 Go 并尝试实现它。我的 JSON 数据如下所示:

private static final class ListenersHandler extends Handler {
    private final WeakReference<DialogInterface> mDialog;

    public ListenersHandler(Dialog dialog) {
        mDialog = new WeakReference<>(dialog);
    }

    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case disMISS:
                ((OndismissListener) msg.obj).ondismiss(mDialog.get());
                break;
            case CANCEL:
                ((OnCancelListener) msg.obj).onCancel(mDialog.get());
                break;
            case SHOW:
                ((OnShowListener) msg.obj).onShow(mDialog.get());
                break;
        }
    }
}

我将如何为这种数据类型创建结构? 我试过这个:

{
    "site1": [
    "site1_router01","site1_router02"
    ],"site2": [
    "site2_router01","site2_router02","site2_router03","site2_router04"
    ],"site3": [
    "site3_router01","site3_router02"
    ]
}

但是当我运行代码时出现此错误

type site map[string][]string
type siterouters struct {
    site
}

func main() {
    var input []byte
    for in := bufio.NewScanner(os.Stdin); in.Scan(); {
        input = append(input,in.Bytes()...)
        input = append(input,'\n')
    }

    // fmt.Println(string(input))
    data := []siterouters{}
    if err := json.Unmarshal(input,&data); err != nil {
        fmt.Println(err)
        return
    }
}

JSON 文件可以包含任意数量站点,以及与特定站点关联的任意数量的路由器。网站将永远是独一无二的。 谢谢。

解决方法

您创建了两个不必要的图层;如果引用的 JSON 在 [{"site":{ 内,您的代码将起作用,但事实并非如此。去掉两个外层——结构体和切片——并直接解组到地图中:

data := map[string][]string{}
if err := json.Unmarshal(input,&data); err != nil {
    fmt.Println(err)
    return
}
fmt.Println(data)

在操场上工作:https://play.golang.org/p/IMrddWu8JAx