我有一个处理 json 继承的 Java 代码,代码是这样的:
public class BaseMessage {
private String messageId;
private Integer type;
...
}
public class TextMessage extends BaseMessage {
private String recipient;
private String sender;
...
}
public class SystemTextMessage extends BaseMessage {
private String field1;
private String field2;
...
}
还有一些其他类
我正在像这样使用 Gson 库:
RuntimeTypeAdapterFactory<BaseMessage> runtimeTypeAdapterFactory = RuntimeTypeAdapterFactory
.of(BaseMessage.class, "type")
.registerSubtype(TextMessage.class,
String.valueOf(MessageType.TEXT_MESSAGE))
.registerSubtype(SystemTextMessage.class,
String.valueOf(MessageType.SYSTEM_MESSAGE))
;
Gson gson = new GsonBuilder().registerTypeAdapterFactory(runtimeTypeAdapterFactory).create();
Type listType = new TypeToken<List<BaseMessage>>(){}.getType();
List<BaseMessage> list = gson.fromJson(json, listType);
然后我只是遍历列表并通过“instanceof”进行比较。
那 golang 呢?有没有办法做同样的事情?我没有找到类似的东西。任何1可以帮助吗? 谢谢。
最佳答案
在不使用任何外部库的情况下,您可以:
package main
import (
"encoding/json"
"fmt"
"reflect"
)
type BaseMessage struct {
MessageId string `json:"messageId"`
Type int `json:"type"`
}
type TextMessage struct {
*BaseMessage
Field1 string `json:"field1"`
Field2 string `json:"field2"`
}
type SystemTextMessage struct {
*BaseMessage
Field1 string `json:"field1"`
Field2 string `json:"field2"`
}
func parseJson(input []byte) []interface{} {
var raw []map[string]interface{}
json.Unmarshal(input, &raw)
var elements []interface{}
for _, element := range raw {
typeId := int(element["type"].(float64))
base := &BaseMessage{
MessageId: element["messageId"].(string),
Type: typeId,
}
switch typeId {
case 1:
elements = append(elements, &TextMessage{base, element["field1"].(string), element["field2"].(string)})
break
case 2:
elements = append(elements, &SystemTextMessage{base, element["field1"].(string), element["field2"].(string)})
break
}
}
return elements
}
func main() {
input := []byte(`
[{
"messageId": "text",
"type": 1,
"field1": "field 1",
"field2": "field 2"
}, {
"messageId": "system",
"type": 2,
"field1": "field 1",
"field2": "field 2"
}]
`)
for _, element := range parseJson(input) {
fmt.Println(reflect.TypeOf(element))
}
}
您可以在这里尝试一下:https://play.golang.org/p/hB8qG6oflhR
不过要小心,代码不会处理错误。
我不确定是否有更自动化的方法,但我相信您必须在此处使用裸接口(interface){}。
关于json - 在golang中处理json继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50642087/
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":
在我的系统中,我已经定义了STI。Dog继承自Animal,在animals表中有一个type列,其值为"Dog"。现在我想让SpecialDog继承自dog,只是为了在某些特殊情况下稍微修改一下行为。数据还是一样。我需要通过SpecialDog运行的所有查询,以返回数据库中类型为Dog的值。我的问题是因为我有一个type列,rails将WHERE"animals"."type"IN('SpecialDog')附加到我的查询中,所以我不能获取原始的Dog条目。所以我想要的是以某种方式覆盖rails在通过SpecialDog访问数据库时使用的值,使其表现得像Dog。有没有办法覆盖用于类型
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。
我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'
所以我只是对此感到好奇:DataMapper为其模型使用混合classPostincludeDataMapper::Resource虽然active-record使用继承classPost有谁知道为什么DataMapper选择这样做(或者为什么AR选择不这样做)? 最佳答案 它允许您从另一个不是DM类的类继承。它还允许动态地将DM功能添加到类中。这是我正在处理的模块中的类方法:defdatamapper_classklass=self.dupklass.send(:include,DataMapper::Resource)klass