88510


習作として、「URLでidとnameを指定して、それをJSON形式に変換し返却する」というプログラムを書いています。  
以下のようにプログラムを書いたのですが、index関数のResult部分でエラーが発生し、コンパイルできません。  
「Serializeを実装していない」というエラーハンドリングに関する文法エラーなのですが、ここからどう修正してよいのかわかりません。  
どこが問題で何をするとよいのか教えていただけると嬉しいです。  
↓main.rs

[code]

    use actix_web::{get, web, App, HttpResponse, HttpServer, Responder, Result};
    use serde::{Deserialize, Serialize};
    
    #[derive(Serialize, Deserialize)]
    struct NameId{
        name: String,
        id: u32,
    }
    
    #[get("/{id}/{name}/index.html")]
    async fn index(name_id: web::Path<NameId>) ->Result<impl Responder> {
        Ok(web::Json(name_id))
    }
    
    #[actix_web::main]
    async fn main() -> std::io::Result<()> {
        HttpServer::new(|| App::new().service(index))
            .bind("127.0.0.1:8080")?
            .run()
            .await
    }
    
[/code]

↓Cargo.toml

[code]

    [package]
    name = "test"
    version = "0.1.0"
    edition = "2021"
    
    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
    
    [dependencies]
    actix-web = "4.0.1"
    serde = {version = "1.0.136", features = ["derive"]}
    serde_json = "1.0.79"
    
    
[/code]

追記  
↓エラー出力

[code]

    error[E0277]: the trait bound `actix_web::web::Path<NameId>: _::_serde::Serialize` is not satisfied
      --> src\main.rs:15:46
       |
    15 | async fn index(name_id: web::Path<NameId>) ->Result<impl Responder> {
       |                                              ^^^^^^^^^^^^^^^^^^^^^^ the trait `_::_serde::Serialize` is not implemented for `actix_web::web::Path<NameId>`
       |
       = note: required because of the requirements on the impl of `Responder` for `Json<actix_web::web::Path<NameId>>`       
    
    For more information about this error, try `rustc --explain E0277`.
    
[/code]


CC BY-SA 4.0
2022-04-24T17:27:57.853
88478
2022-04-26T06:37:47.533
2022-04-25T12:40:16.063
52183
52183
question
json http rust
httpでJSONデータを返すRustプログラムのエラーハンドリング


結論から言うと、以下の行を

[code]

        Ok(web::Json(name_id))
    
[/code]

  
以下のように変更するとエラーが解消します。

[code]

        Ok(web::Json(name_id.into_inner()))
    
[/code]

**説明**

元のコードでは`name_id`の値を`web::Json`構造体に入れていますが、`name_id`引数の型である`Path<NameId>`型は`Serialize`を実装していません。そのために以下のエラーになっています。

[code]

    error[E0277]: the trait bound `actix_web::web::Path<NameId>: _::_serde::Serialize` is not satisfied
    
[/code]

`name_id.into_inner()`とすると、`Path<NameId>`型の値の中にある`NameId`型の値が取り出せます。`NameId`型は`#[derive(Serialize,
...)]`により`Serialize`を実装していますのでエラーが解消するわけです。


CC BY-SA 4.0
2022-04-26T06:37:47.533
88510
2022-04-26T06:37:47.533
14101
88478
answer