当前位置: 首页 > 知识库问答 >
问题:

将map[string]字符串编组到json会返回错误吗?

徐德海
2023-03-14
m := map[string]string{}
//... do stuff to the map
b, err := json.Marshal(m)

在这种情况下,json.marshal调用是否会返回错误?

我想知道部分是出于好奇,部分是考虑我是否需要担心错误检查。

共有1个答案

东郭弘方
2023-03-14

因为任何有效的字符串值都是有效的键,也是JSON中的有效值(有关详细信息,请参阅JSON键名中哪些字符有效/无效?),所以理论上它不会返回任何错误。

如果发生内存不足错误,json.marshal()将不会返回,应用程序将以错误代码终止。

由于Go将string存储为UTF-8编码的字节序列,因此存在UTF-8编码的字符串内容无效的问题。这也不会导致任何错误,因为Go将用Unicode替换字符U+FFFD替换无效代码点,如本例所示:

m := map[string]string{"\xff": "a"}
data, err := json.Marshal(m)
fmt.Println(string(data), err)

输出(在围棋操场上试试):

{"\ufffd":"a"} <nil>

json.marshal():

字符串值编码为强制为有效UTF-8的JSON字符串,用Unicode替换符文替换无效字节。

这意味着Go运行时可以检测一个映射是否在goroutine中被读取或修改,并且它是否被另一个goroutine在不同步的情况下同时修改。

因此,这里的场景是将映射[string]字符串传递给json.marshal()。为了封送它,JSON包显然必须迭代映射的键值。如果我们同时修改映射,将导致失败。

下面是引发它的示例代码(循环是为了增加并发修改的可能性,否则我们将掌握在goroutine调度器手中):

m := map[string]string{"\xff": "a"}

go func() {
    for i := 0; i < 10000; i++ {
        m["x"] = "b"
    }
}()

for i := 0; i < 10000; i++ {
    if _, err := json.Marshal(m); err != nil {
        panic(err)
    }
}
fatal error: concurrent map iteration and map write
 类似资料:
  • 问题内容: 说我有以下代码: 在这种情况下,有什么办法可以使调用返回错误? 我想知道,部分原因是出于好奇,另一部分是考虑是否需要担心该错误检查。 问题答案: 由于任何有效值都是有效键,而且也是JSON中的有效值(有关详细信息,请参阅JSON键名中的哪些字符有效/无效?,因此从理论上讲,它不会返回任何错误。 如果发生内存不足错误,则不会返回错误,您的应用将终止并显示错误代码。 由于Go将值存储为其U

  • 场景:用于编辑产品详细信息的HTML文档被编码为ISO-8859-1,并将POST数据发送到PHP文件(也被编码为ISO-8859-1)。这个PHP文件有mysql_real_escape_string-functions来清理输入。数据库/MySQL server字符集为UTF-8。问题是,当POST字符串中包含斯堪的纳维亚字母(ä,ö,å)时,mysql_real_escape_string返

  • 我正试图用jackson-core-2.9.6把我的json转换成地图。我的json是 我试图将JSON解析成Map的Java代码是这样的 我得到的异常是com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造(尽管至少存在一个Creator):没有String参数构造函数/工厂方法可以从[源:(String)“”{\r\n“

  • 问题内容: 我运行以下代码: 游乐场: http : //play.golang.org/p/qbkEIZRTPQ 输出: 所需的输出: 为什么base64编码它就像普通的一样? 毕竟,RawMessage的MarshalJSON实现只是返回字节片 问题答案: 在螺母中找到答案 传递给的值必须是正常工作的指针:

  • 问题内容: 为了使进度报告过程更加可靠,并使它与请求/响应脱钩,我正在Windows Service中执行处理,并将预期的响应持久化到文件中。当客户端开始轮询更新时,其目的是控制器以JSON字符串形式返回文件的内容(无论它们是什么)。 该文件的内容已预序列化为JSON。这是为了确保在响应过程中没有任何阻碍。无需进行任何处理(只需将文件内容读入字符串并返回)即可获得响应。 我最初虽然很简单,但事实并

  • 问题内容: 我正在开发一个使用JSON进行服务器通信的Android应用,当我尝试解析json文件时遇到了一个奇怪的问题。 这是我来自服务器的json 我通过调用地址Json-object 获得City的价值。对于这种情况,我期望为空(这是optString的意思吗?),但实际上它包含字符串“ null”。因此,进一步的null或isEmpty- checks将返回false,因为String包含