当前位置: 首页 > 面试题库 >

JSON和处理未导出的字段

刘嘉木
2023-03-14
问题内容

是否存在技术原因,为什么编码/ json不包含未导出的字段?如果不是这样,这是一个任意决定,即使未导出,是否还会有其他后门选项(例如“ +”)包括在内?

要求导出客户端代码来获得此功能感到很不幸,尤其是在小写形式提供封装或封送结构的决定比其设计晚得多的情况下。

人们如何处理这个问题?只是出口一切?

另外,不导出字段名称会使遵循建议的惯用法变得困难。我认为,如果结构X具有字段Y,则不能具有访问器方法Y()。如果要提供对Y的接口访问权限,则必须为getter命名一个新名称,根据http://golang.org/doc/effective_go.html#Getters,无论您得到什么,都是不习惯的


问题答案:

有技术原因。除非已导出,否则json库无权使用反射查看字段。包只能查看其自己包中类型的未导出字段

为了解决您的问题,您可以做的是使用导出的字段创建未导出的类型。如果将Json毫无问题地传递给未导出的类型,它将解组,但是它不会显示在API文档中。然后,您可以创建嵌入未导出类型的导出类型。然后,此导出的类型将需要方法来实现json.Marshalerand
json.Unmarshaler接口。

注意:所有代码未经测试,甚至可能无法编译。

type jsonData struct {
    Field1 string
    Field2 string
}

type JsonData struct {
    jsonData
}

// Implement json.Unmarshaller
func (d *JsonData) UnmarshalJSON(b []byte) error {
    return json.Unmarshal(b, &d.jsonData)
}

// Getter
func (d *JsonData) Field1() string {
    return d.jsonData.Field1
}


 类似资料:
  • 我正在发送一个json请求,并在python flask服务中捕获请求参数以进一步处理。但是,当我json转储请求并试图从中收集特定的参数值时,它会给我带来错误 “字符串索引必须是整数,而不是字符串” 这是我在python flask中解析的json: 我不知道我做错了什么。 下面是我的python烧瓶代码:

  • JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。尽管JSON是Javascript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及浏览器的内建快速解析支持,

  • 问题内容: 我正在使用GWT应用程序,该应用程序正在接收JSON字符串,而我很难了解每个对象的值。我正在尝试将传入的JSON字符串传输到对象数组中。 这是JSON(来自Firebug响应选项卡),“ d”是.NET(正在使用的Web服务是C#)。 我正在尝试将JSON解析为对象,然后将它们插入数组。我能够使用并获取整个“ d”对象以进行回显。但是,当我尝试访问数组的元素时,GWT调试器会崩溃。 }

  • 问题内容: 我们在Spring 3.0.5上运行Tomcat 6.0,由于某种原因,我们无法通过jsps来评估$ {blah}。这是一个Maven项目,有很多单独的模块,如果需要的话,Eclipse Helios。 这是我的web.xml的片段 这不是(<%@ page isELIgnored =“ false”%>),因为当我将其放入jsp时,页面仅显示为文本,这意味着 $ {2 + 2}未评估

  • 问题内容: 我看了其他几个问题,但我仍然不完全理解。我想将JSON字符串发布到远程地址,然后从JSON响应中检索值。我正在使用Java的Apache库。 作为主体,我将通过以下示例(): 我也完全不知道如何从响应中检索JSON值。 问题答案: 最简单的方法是使用类似google-http-java-client之类的库,但是如果您想自己解析JSON响应,则可以通过多种方式进行,您可以使用org.j

  • 问题内容: 如果我将类型定义为: 那我该如何克隆这种类型的对象呢?如果我做一个简单的任务: 然后,对受影响的两个对象所做的任何更改。由于未导出,因此即使使用反射提取,也无法显式复制。 我目前在类型本身的包中提供一个方法。但这对其他软件包中的类似类型没有帮助。还有另一种方法吗? 问题答案: 你不能 这就是未导出字段的意义:只有声明包才能修改它们。 请注意,如果在另一个包中声明了该类型,则您甚至无法编