GVKun编程网logo

如何使用无法在结构中捕获为动态JSON的动态密钥解组jSON:GOlang [重复]

32

对于想了解如何使用无法在结构中捕获为动态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 [重复]

如何使用无法在结构中捕获为动态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字符串

android – 使用改进解析动态密钥Json字符串

我试图解析下面的动态密钥Json String.
"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;
        }
    }

任何建议如何解析在这种情况下!

解决方法

您的resultInside类添加了一个不存在于JSON中的额外的对象层.尝试将地图移动到您的数据类结果字段.
public class Data {
    @Serializedname("results")
    @Expose
    private Map<String,Vitals> result;

    //....
}

angularjs – 如何使用Angular Material动态创建基于JSON的菜单栏?

angularjs – 如何使用Angular Material动态创建基于JSON的菜单栏?

我试图使用 Angular Material Menu Bar directive递归创建一个菜单栏,但结果不符合预期.到目前为止,我所拥有的最佳解决方案是创建一个指令并递归调用它,如下所示: https://plnkr.co/edit/5pFmmD6K3qz5qolRifVA.请注意,此Plunker中有两个菜单栏.第一个是使用JSON的递归结构创建的,第二个是直接写在模板上.当有嵌套菜单如“Lorem – > Dolor – > …”时,我的解决方案会出现问题,因为嵌套菜单没有正确对齐.

检查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 顶级字段是可变的。如何在结构体中使用

Golang - 返回的 JSON 顶级字段是可变的。如何在结构体中使用

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)的使用

golang API json,struct结构中标签(Tag)的使用

 
 

在看别人的一些代码时,声明结构时有个是做什么用的?

想知道原因得了解下:

在golang中,命名都是推荐都是用驼峰方式,并且在首字母大小写有特殊的语法含义:包外无法引用。但是由经常需要和其它的系统进行数据交互,例如转成json格式,存储到Redis等等。这个时候如果直接用属性名来作为键值会不符合项目要求。

于是就有了tag,也就是有了或者也或者json:name orm:"size(1000)"这样的声明。

在我们把结构转成json时 就会以tag里面的名字出现。

下面这是我在用beego框架的orm声明的一个结构体


  
  

当我们在控制器中写api时就可以直接取了


  
  

这时访问接口返回的数据就是以tag里面的命名的key


返回的json
作者:满损谦益链接: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 }

关于如何使用无法在结构中捕获为动态JSON的动态密钥解组jSON:GOlang [重复]的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android – 使用改进解析动态密钥Json字符串、angularjs – 如何使用Angular Material动态创建基于JSON的菜单栏?、Golang - 返回的 JSON 顶级字段是可变的。如何在结构体中使用、golang API json,struct结构中标签(Tag)的使用等相关知识的信息别忘了在本站进行查找喔。

本文标签: