Home  >  Article  >  Backend Development  >  Convert values ​​when marshalling

Convert values ​​when marshalling

PHPz
PHPzforward
2024-02-09 17:36:311181browse

Convert values ​​when marshalling

php editor Strawberry introduces you to converting values ​​during grouping. In programming, converting values ​​when marshalling refers to the operation of converting between different data types. By converting values, we can convert a value of one data type to another data type to meet specific needs. For example, convert a string to an integer, or an integer to a string, etc. Converting values ​​is one of the very common and important operations in programming. Mastering the use of converted values ​​can improve the flexibility and readability of the code, while also avoiding some potential errors and problems. In the following articles, we will introduce in detail the conversion methods and considerations between different data types to help you better understand and apply conversion values ​​when marshalling.

Question content

Given the code below, is it possible to convert names when unmarshalling? Let's say I want it to always be lowercase regardless of whether it's in the actual json or not.

type Person struct {
    FirstName string `json:"first_name"`
    LastName  string `json:"last_name"`
}

func main() {
    jsonText := GetJsonFromSomewhere()
    var v Person
    json.Unmarshal(jsonText, &v)
}

Workaround

One way to achieve this is to create a custom type that implements the unmarshaler## from the encoding/json package # interface. This is the link to this interface. Any type that implements unmarshaler can be used as the type of a structure field when doing json unmarshalling. When unmarshalling, encoding/json will use the implementation of the interface's unmarshaljson function to convert the json bytes to the field type.

So you can write a

unmarshaljson function that, among other things, changes the string value to lowercase.

Here is an example:

type lowercasestring string

func (l *lowercasestring) unmarshaljson(bytes []byte) error {
    lowercasedstring := strings.tolower(string(bytes))

    *l = lowercasestring(lowercasedstring)

    return nil
}

Then, in the structure of the json map, you can use a custom type instead of

string:

type person struct {
    firstname lowercasestring `json:"first_name"`
    lastname  lowercasestring `json:"last_name"`
}

If you unmarshal into this structure, the values ​​for firstname and lastname will be lowercase (also note that you will need to type-convert them back to

string to use them as string s).

testJSON := `{"first_name" : "TestFirstNAME", "last_name": "TestLastNAME"}`
var result Person

err := json.Unmarshal([]byte(testJSON), &result)
if err != nil { /*handle the error*/ }

fmt.Println(result.FirstName) // prints "testfirstname"

var stringLastName string
stringLastName = string(result.LastName) // need to type convert from LowerCaseString to string

fmt.Println(stringLastName) // prints "testlastname"

This is the above code running in the go playground.

The above is the detailed content of Convert values ​​when marshalling. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete