如何从golang

时间:2017-08-16 05:49:50

标签: php go

我需要从PHP代码生成的序列化字符串中获取值

所以我使用名为php_serialize的包来反序列化字符串,然后获得interface{}类型的结果。

但我不知道如何在结果中获取值。

这是代码:

package main

import (
    "github.com/yvasiyarov/php_session_decoder/php_serialize"
    "fmt"
)

func main() {
    // this string is generated from php code
    str := `a:3:{s:4:"name";s:3:"tom";s:3:"age";s:2:"23";s:7:"friends";a:2:{i:0;a:1:{s:4:"name";s:5:"jerry";}i:1;a:1:{s:4:"name";s:4:"jack";}}}`

    decoder := php_serialize.NewUnSerializer(str)

    if result, err := decoder.Decode(); err != nil {
        panic(err)
    } else {
        fmt.Println(result)
    }
}

打印结果为:

map[name:tom age:23 friends:map[0:map[name:jerry] 1:map[name:jack]]]

此结果为php_serialize.PhpValue类型,即interface{}类型

下一步是如何在结果中获取值?

例如获取age字段和值

2 个答案:

答案 0 :(得分:2)

您必须将result置为map[string]interface

mResult := result.(map[string]interface{})
fmt.Println(mResult["name"])

再一次断言friends

mFriends := mResult["friends"].(map[int]map[string]interface{}) 

然后使用它:mFriends[0]["name"]

答案 1 :(得分:1)

以下是访问数据的一些方法:

package main

import (
    "fmt"

    "github.com/yvasiyarov/php_session_decoder/php_serialize"
)

func main() {
    // this string is generated from php code
    str := `a:3:{s:4:"name";s:3:"tom";s:3:"age";s:2:"23";s:7:"friends";a:2:{i:0;a:1:{s:4:"name";s:5:"jerry";}i:1;a:1:{s:4:"name";s:4:"jack";}}}`

    decoder := php_serialize.NewUnSerializer(str)

    result, err := decoder.Decode()
    if err != nil {
        panic(err)
    }
    fmt.Println(result)

    // simple assert
    t := result.(php_serialize.PhpArray)
    // use php_seriale build in function to get string
    strVal := php_serialize.PhpValueString(t["name"])
    fmt.Println(strVal)

    // type switch in case of different valid types
    switch t := result.(type) {
    default:
        fmt.Printf("unexpected type %T\n", t) // %T prints whatever type t has
    case php_serialize.PhpArray:
        fmt.Println(t)
        fmt.Println(t["name"])
        fmt.Println(t["age"])

        // should be done recursively...
        switch f := t["friends"].(type) {
        default:
            fmt.Printf("unexpected type %T\n", f) // %T prints whatever type t has
        case php_serialize.PhpArray:
            fmt.Println(f)
            fmt.Println(f[0])
            fmt.Println(f[1])
        }
    }
}

我希望这会给你一些想法。

基本概念

  • php_serialize内置了转换基元的函数。
  • 变量结构用内置类型表示,需要用它来访问结构。