Convert values ​​when marshalling

PHPz
Release: 2024-02-09 17:36:31
forward
1214 people have browsed it

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)
}
Copy after login

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
}
Copy after login

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"`
}
Copy after login

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"
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!