gpt4 book ai didi

json - 镍.rs : Receiving JSON data using HTTP POST request - rust keyword clash + fail on JSON null values

转载 作者:行者123 更新时间:2023-11-29 08:19:30 24 4
gpt4 key购买 nike

我正在尝试从 GitLab 的网络 Hook 发送的 POST 请求中打印出 JSON 数据:http://doc.gitlab.com/ee/web_hooks/web_hooks.html

我正在使用 http://nickel.rs目前我面临两个障碍:

  1. 要在 Nickel.rs 中解析 JSON POST 请求,您必须定义一个实现 Decodable 的结构,该结构的字段名称也必须与 JSON 字段名称相匹配。但是,GitLab 的“推送事件”请求正文包含一个名为 ref 的字段,这与 Rust 关键字冲突并引发编译时错误:error: expected identifier, found keyword `ref`

这是一个简短的代码示例:

extern crate serialize;
extern crate nickel;

use std::io::net::ip::Ipv4Addr;
use nickel::{ Nickel, Request, Response, JsonBody, HttpRouter };

#[deriving(Decodable, Show)]
pub struct Example {
ref: String,
}

fn main() {
let mut server = Nickel::new();
server.utilize(Nickel::json_body_parser());

fn post_handler(request: &Request, response: &mut Response) {
let example = request.json_as::<Example>().unwrap();
println!("Example: {}", example);
}

server.post("/example", post_handler);
server.listen(Ipv4Addr(127, 0, 0, 1), 6767);
}

有没有办法在不定义具有相同命名字段的结构的情况下解析 JSON 数据?
尝试将 ref 重命名为 _ref 或其他任何内容都会导致任务失败:

task '<unnamed>' failed at 'called `Option::unwrap()` on a `None` value', /home/rustbuild/src/rust-buildbot/slave/nightly-linux/build/src/libcore/option.rs:347
  1. 当接收到包含空值的 JSON 数据时,程序无法解包。

代码示例:

extern crate serialize;
extern crate nickel;

use std::io::net::ip::Ipv4Addr;
use nickel::{ Nickel, Request, Response, JsonBody, HttpRouter };

#[deriving(Decodable, Show)]
pub struct Example {
foo: String,
}

fn main() {
let mut server = Nickel::new();
server.utilize(Nickel::json_body_parser());

fn post_handler(request: &Request, response: &mut Response) {
let example = request.json_as::<Example>().unwrap();
println!("Example: {}", example);
}

server.post("/example", post_handler);
server.listen(Ipv4Addr(127, 0, 0, 1), 6767);
}

然后执行:curl 'http://localhost:6767/example' -H 'Content-Type: application/json;charset=UTF-8' --data-binary $'{ "foo": null }'

来自 GitLab 的一些 POST 请求可能包含空值(例如在它们的“问题事件”和“合并请求事件”示例中),我如何从这些 POST 请求中打印出 JSON 数据到控制台?

最佳答案

我相信null值用 Option 建模字段,因此在您的情况下您需要 Option<String> ,不只是 String .

至于关键字,我认为没有办法自动解析这些值 - 你必须实现 Decodable对于这样的结构手动。您可以将编译器为 #[deriving(Decodable)] 生成的代码作为基础通过运行 rustc --pretty=expanded在你的 crate 条目文件上。例如,为此:

#[deriving(Decodable)]
struct Test {
_ref: String
}

rustc --pretty=expanded输出这个(手动重新缩进后):

#![feature(phase)]
#![no_std]
#![feature(globs)]
#[phase(plugin, link)]
extern crate "std" as std;
extern crate "native" as rt;
#[prelude_import]
use std::prelude::*;
struct Test {
_ref: String,
}
#[automatically_derived]
impl <__D: ::serialize::Decoder<__E>, __E> ::serialize::Decodable<__D, __E> for Test {
fn decode(__arg_0: &mut __D) -> ::std::result::Result<Test, __E> {
__arg_0.read_struct("Test", 1u, |_d|
::std::result::Ok(Test {
_ref: match _d.read_struct_field("_ref", 0u, |_d| ::serialize::Decodable::decode(_d)) {
Ok(__try_var) => __try_var,
Err(__try_var) => return Err(__try_var),
},
})
)
}
}

关于json - 镍.rs : Receiving JSON data using HTTP POST request - rust keyword clash + fail on JSON null values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26321095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com