对于想了解如何使用无法在结构中捕获为动态JSON的动态密钥解组jSON:GOlang[重复]的读者,本文将提供新的信息,并且为您提供关于android–使用改进解析动态密钥Json字符串、angula
对于想了解如何使用无法在结构中捕获为动态JSON的动态密钥解组jSON:GOlang [重复]的读者,本文将提供新的信息,并且为您提供关于android – 使用改进解析动态密钥Json字符串、angularjs – 如何使用Angular Material动态创建基于JSON的菜单栏?、Golang - 返回的 JSON 顶级字段是可变的。如何在结构体中使用、golang API json,struct结构中标签(Tag)的使用的有价值信息。
本文目录一览:- 如何使用无法在结构中捕获为动态JSON的动态密钥解组jSON:GOlang [重复]
- android – 使用改进解析动态密钥Json字符串
- angularjs – 如何使用Angular Material动态创建基于JSON的菜单栏?
- Golang - 返回的 JSON 顶级字段是可变的。如何在结构体中使用
- golang API json,struct结构中标签(Tag)的使用
如何使用无法在结构中捕获为动态JSON的动态密钥解组jSON:GOlang [重复]
我定义了这个结构:
type X struct { A string `json:"a_known_string"` B string `json:"b_known_string"`}
此示例JSON:
jsnStr:= [从文件中读取并打印出来以确认]
它是:
{ "any string" : { "a_known_string" : "some value", "b_known_string" : "another value" }}
如果只是结构,我可以:
var x Xerr := json.Unmarshal(jsnStr, &x)
但是我需要捕获“任何字符串”。我该怎么做?
答案1
小编典典使用地图:
var m map[string]Xerr := json.Unmarshal([]byte(jsnStr), &m)
游乐场的例子
android – 使用改进解析动态密钥Json字符串
"report":{ "data":{ "results":{ "558952cca6d73d7d81c2eb9d":{ "Max":-1,"Min":-1,"Slope":-1,},"558ce148a6d73d7d81c2fa8a":{ "Max":-2,"Slope":-2,} } } }
以下我试图获取数据,但在解析最后一个动态json字符串时收到错误.
public class Report { @Serializedname("data") @Expose private Data data; public Data getData() { return data; } public void setData(Data data) { this.data = data; } @Override public String toString() { return "Report{" + "data=" + data + '}'; } } public class Data { @Serializedname("results") @Expose private ResultInside result; public ResultInside getResult() { return result; } public void setResult(ResultInside result) { this.result = result; } } public class ResultInside { /*@Serializedname("results") @Expose*/ private Map<String,Vitals> elemDetails = new HashMap<>(); public Map<String,Vitals> getElemDetails() { return elemDetails; } public void setElemDetails(Map<String,Vitals> elemDetails) { this.elemDetails = elemDetails; } }
任何建议如何解析在这种情况下!
解决方法
public class Data { @Serializedname("results") @Expose private Map<String,Vitals> result; //.... }
angularjs – 如何使用Angular Material动态创建基于JSON的菜单栏?
检查Chrome上生成的代码,我注意到第二个菜单栏中的嵌套菜单(直接写在模板上)有一些关于其嵌套状态的属性:
<md-menu md-position-mode="cascade"https://www.jb51.cc/tag/nes/" target="_blank">nested-menu md-menu ng-scope" md-nest-level="1"> ... </md-menu>
而第一个菜单栏中的相同菜单没有:
<md-menu ng-if="ctrl.isCompoundedMenuItem()"https://www.jb51.cc/tag/cop/" target="_blank">cope"> ... </md-menu>
我该怎么做才能解决这个问题?
只是添加一个信息:我已经尝试了方法using ng-include
来创建菜单栏,但结果非常糟糕.
<md-menu ng-if="ctrl.isCompoundedMenuItem()" md-position-mode="cascade"https://www.jb51.cc/tag/nes/" target="_blank">nested-menu" md-nest-level="{{ ::nestLevel }}">
其中nestLevel位于隔离范围内,并在每个新级别上递增:
<md-menu-content> <my-menu-item ng-repeat="item in menu.items" menu="item" nest-level="{{ ::(nestLevel + 1) }}"></my-menu-item> </md-menu-content>
从1开始,自然:
<md-menu-bar ...> ... <md-menu-content> <my-menu-item ng-repeat="item in menu.items" menu="item" nest-level="1"></my-menu-item> </md-menu-content> </md-menu-bar>
更新的plunker可以在这里看到:https://plnkr.co/edit/QBjeR2hZFKsJ88Hl4ptG.
Golang - 返回的 JSON 顶级字段是可变的。如何在结构体中使用
我有一个来自 API 的 JSON 响应,如下所示:
{ "1091500": { "data": { "price_overview": { "final_formatted": "$59.99" } } } }
当我解组并访问我需要的价格值时,我的结构工作正常。 price.AppID.Data.PriceOverview.FinalFormatted
此处的结构:
type SteamApp struct { AppID struct { Data struct { PriceOverview struct { FinalFormatted string `json:"final_formatted"` } `json:"price_overview"` } `json:"data"` } `json:"1091500"` }
我正在尝试解决的是顶级密钥“1091500”。这是由单独函数生成的值,实际上是获取上述数据所需的搜索词。话虽这么说,它是动态的,并且是在运行时通过单独的 API 调用发现的。因为您需要结构中的 JSON 标记,所以我正在努力想出一种方法来概括它。
到目前为止,最好的方法是找到一个以不同方式返回数据的不同 API,但我还没有找到。我还考虑过找到一种方法来“跳过”初始部分,因为我有正确的数据,这只是“阅读”它的问题。预先感谢您,我希望我能很好地解释自己。
立即学习“go语言免费学习笔记(深入)”;
正确答案
分两步解组。首先进入映射,然后进入结构类型。您可以通过实现 json.Unmarshaler 自动执行此操作:
package main import ( "encoding/json" "fmt" ) var j = []byte(`{ "1091500": { "data": { "price_overview": { "final_formatted": "$59.99" } } } }`) func main() { var t T err := json.Unmarshal(j, &t) fmt.Println(err) fmt.Printf("%+v\n", t) } type T struct { AppID string `json:"-"` PriceOverview struct { FileFormatted string `json:"final_formatted"` } `json:"price_overview"` } func (t *T) UnmarshalJSON(b []byte) error { var m map[string]struct { Data json.RawMessage } err := json.Unmarshal(b, &m) if err != nil { return err } type T_ T // prevent recursion var t_ T_ for appID, x := range m { err := json.Unmarshal(x.Data, &t_) if err != nil { return err } *t = T(t_) t.AppID = appID break } return nil }
在操场上尝试一下:https://www.php.cn/link/8571ddcc1c64ca1fa11891d899cab05d
我假设数据属性只是噪音并使其透明。如果我弄错了,请使用 map[string]json.RawMessage 并将数据字段添加到类型 T。
如果您也想自动编组为相同的格式,请实现 json.Marshaler还有:
func (t T) MarshalJSON() ([]byte, error) { type T_ T // prevent recursion m := map[string]struct { Data T_ `json:"data"` }{ t.AppID: {Data: T_(t)}, } return json.Marshal(m) }
以上就是Golang - 返回的 JSON 顶级字段是可变的。如何在结构体中使用的详细内容,更多请关注php中文网其它相关文章!
golang API json,struct结构中标签(Tag)的使用
作者:满损谦益链接:http://www.jianshu.com/p/7bd3adc99efe來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。json:namejson:nameorm:"size(1000)"// 评论 type Comment struct { Id int64 `json:"id"` Tid int64 `json:"tid"` NickName string `json:"nickName"` Content string `json:"content" orm:"size(1000)"` Created time.Time `json:"created" orm:"index"` }func (this *ApiCommentController) All() { tid := this.input().Get("tid") // 获取评论 comments,err := models.GetAllComment(tid) if err != nil { beego.Error(err) } this.Data["json"] = map[string]interface{}{ "code": 0,"message": "获取成功","date": comments,} this.ServeJSON() return }在看别人的一些代码时,声明结构时有个是做什么用的?
想知道原因得了解下:
在golang中,命名都是推荐都是用驼峰方式,并且在首字母大小写有特殊的语法含义:包外无法引用。但是由经常需要和其它的系统进行数据交互,例如转成json格式,存储到Redis等等。这个时候如果直接用属性名来作为键值会不符合项目要求。
于是就有了tag,也就是有了或者也或者json:name orm:"size(1000)"这样的声明。
在我们把结构转成json时 就会以tag里面的名字出现。
下面这是我在用beego框架的orm声明的一个结构体
当我们在控制器中写api时就可以直接取了
这时访问接口返回的数据就是以tag里面的命名的key
返回的json
关于如何使用无法在结构中捕获为动态JSON的动态密钥解组jSON:GOlang [重复]的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android – 使用改进解析动态密钥Json字符串、angularjs – 如何使用Angular Material动态创建基于JSON的菜单栏?、Golang - 返回的 JSON 顶级字段是可变的。如何在结构体中使用、golang API json,struct结构中标签(Tag)的使用等相关知识的信息别忘了在本站进行查找喔。
本文标签: