golang使用接口和类型断言在go中使用任意键名解析json对象(代码片段)

author author     2023-01-31     710

关键词:

// Parsing arbitrary JSON using interfaces in Go
// Demonstrates how to parse JSON with abritrary key names
// See https://blog.golang.org/json-and-go for more info on generic JSON parsing

package main

import (
	"encoding/json"
	"fmt"
)

var jsonBytes = []byte(`

	"key1":
		"Item1": "Value1",
		"Item2": 1,
	"key2":
		"Item1": "Value2",
		"Item2": 2,
	"key3":
		"Item1": "Value3",
		"Item2": 3
`)

// Item struct; we want to create these from the JSON above
type Item struct 
	Item1 string
	Item2 int


// Implement the String interface for pretty printing Items
func (i Item) String() string 
	return fmt.Sprintf("Item: %s, %d", i.Item1, i.Item2)


func main() 

	// Unmarshal using a generic interface
	var f interface
	err := json.Unmarshal(jsonBytes, &f)
	if err != nil 
		fmt.Println("Error parsing JSON: ", err)
	

	// JSON object parses into a map with string keys
	itemsMap := f.(map[string]interface)

	// Loop through the Items; we're not interested in the key, just the values
	for _, v := range itemsMap 
		// Use type assertions to ensure that the value's a JSON object
		switch jsonObj := v.(type) 
		// The value is an Item, represented as a generic interface
		case interface:
			var item Item
			// Access the values in the JSON object and place them in an Item
			for itemKey, itemValue := range jsonObj.(map[string]interface) 
				switch itemKey 
				case "Item1":
					// Make sure that Item1 is a string
					switch itemValue := itemValue.(type) 
					case string:
						item.Item1 = itemValue
					default:
						fmt.Println("Incorrect type for", itemKey)
					
				case "Item2":
					// Make sure that Item2 is a number; all numbers are transformed to float64
					switch itemValue := itemValue.(type) 
					case float64:
						item.Item2 = int(itemValue)
					default:
						fmt.Println("Incorrect type for", itemKey)
					
				default:
					fmt.Println("Unknown key for Item found in JSON")
				
			
			fmt.Println(item)
		// Not a JSON object; handle the error
		default:
			fmt.Println("Expecting a JSON object; got something else")
		
	


golang类型断言的使用(typeassertion)(代码片段)

第一部分首先,转自https://studygolang.com/articles/3314对断言的基本介绍golang的语言中提供了断言的功能。golang中的所有程序都实现了interface的接口,这意味着,所有的类型如string,int,int64甚至是自定义的struct类型都就此拥有了interface... 查看详情

golang接口---中(代码片段)

GoLang接口---中引言接口的类型断言实例演示类型判断:type-switchnil和non-nil空接口构建通用类型或包含不同类型变量的数组复制数据切片至空接口切片通用类型的节点数据结构接口到接口参考引言GoLang接口—上上一篇文章中... 查看详情

go语言学习笔记—进阶—接口:在接口和类型之间转换(代码片段)

使用接口断言(typeassertion),我们可以把接口转换成另外一个接口,也可以把接口转换成另外的类型。1.类型断言的格式接口断言类似于控制流中的if,但大量类型断言出现时,应使用更高效的类型分支swit... 查看详情

go语言系列之反射(代码片段)

...类型的反射信息,并且有能力修改它们。Go程序在运行期使用reflect包访问程序的反射信息。在上一篇博客中我们介绍了空接口。空接口可以存储任意类型的变量,那我们如何知道这个空接口保存的数据是什么呢?反射就是在运行... 查看详情

go语言基础之反射(代码片段)

本文介绍了Go语言反射的意义和基本使用。变量的内在机制Go语言中的变量是分为两部分的:类型信息:预先定义好的元信息。值信息:程序运行过程中可动态变化的。反射介绍反射是指在程序运行期对程序本身进行访问和修改的... 查看详情

带有指针的 Golang 类型断言

】带有指针的Golang类型断言【英文标题】:Golangtypeassertionwithpointers【发布时间】:2017-02-1320:39:15【问题描述】:我一直在研究一个用作分层树的界面。这个想法是大声说出具体的实现来调用.Children()、.Father()和一个基于id,FatherId... 查看详情

go接口

...义 classMouseimplementsUSB 1.当需要接口类型的对象时,可以使用任意实现类对象代替 2.接口对象不能访问实现类中的属性,赋值给一个变量(实例对象)是可以访问的 多态:一个事物的多种形态 go语言通过接口模拟多态 就一个接... 查看详情

『golang』面向对象(代码片段)

我们总结一下前面看到的:Go没有类,而是松耦合的类型、方法对接口的实现。面向对象语言最重要的三个方面分别是:封装,继承和多态,在Go中它们是怎样表现的呢?Go实现面向对象的两个关键是struct和interface,结构代替类,... 查看详情

golang接口---下(代码片段)

GoLang接口---下接口与动态类型Go的动态类型动态方法调用接口的提取空接口和函数重载接口的继承Go中的面向对象接口与动态类型Go的动态类型在经典的面向对象语言(像C++,Java和C#)中数据和方法被封装为类的... 查看详情

golang-interface(一基本使用)

github: https://github.com/ZhangzheBJUT/blog/blob/master/interface.md 一接口概述假设说gorountine和channel是支撑起Go语言的并发模型的基石,让Go语言在现在集群化与多核化的时代成为一道亮丽的风景,那么接口是Go语言整个类型系列的基... 查看详情

go类型断言

类型断言作用是判断实现该接口的对象是不是某个类型。可以通过打印空接口的值来推断空接口是什么具体类型。可以通过Printf("%T",x)进行打印,那么..有没有什么方法可以在程序运行中得到空接口的具体类型呢?x.(T)例如:data,o... 查看详情

golang中any类型使用及空接口中类型查询(代码片段)

golang中Any类型使用及类型查询1.Any类型GO语言中任何对象实例都满足空接口interface,空接口可以接口任何值varv1interface=1varv2interface="abc"varv3interface=2.345varv4interface=make(map[..]...)....2.1关于空接口的类型查询方式一,使用okpacka 查看详情

go-反射(代码片段)

...类型的反射信息,并且有能力修改它们。Go程序在运行期使用reflect包访问程序的反射信息。空接口可以存储任意类型的变量,那我们如何知道这个空接口保存的数据是什么呢?反射就是在运行时动态的获取一个变量的类型信息和... 查看详情

golang在任何类型中使用接口返回类型(代码片段)

查看详情

类型断言/类型切换是不是性能不佳/在 Go 中运行缓慢?

...慢?【发布时间】:2015-03-1711:21:56【问题描述】:在Go中使用类型断言/类型切换作为运行时类型发现的方法有多慢?我听说例如在C/C++中,在运行时发现类型的性能很差。为了绕过这一点,您通常将 查看详情

go--type和断言interface{}转换

...,大多数时候开发者并不需要去关注这方面的问题。但是golang中的类型匹配是很严格的,不同的类型之间通常需要手动转换,编译器不会代你去做这个事。我之所以说通常需要手动转换,是因为interface类型作为一个特例,会有不... 查看详情

golang类型断言的学习

...p中只需要一个简单的unserialize()函数就可以完成了.但是在golang中可就没有这么容易了,非得费个九牛二虎之力,写上不少代码才行。这时候只想感叹一下,php真的是世界上最好的语言啊!我就在今天的开发中遇到了这么个问题,... 查看详情

go中接口的类型查询:comma-ok断言和switch测试(代码片段)

//code_026_go_antic_packageprojectmain.go<prename="code"class="plain">packagemainimport("container/list""fmt""math/rand"//备注2:随机数的包"sync"//备注1:异步任务的包"time")typeINFOstructlocksync.Mutex//备注1:异步锁 查看详情