gpt4 book ai didi

json - JSON响应的限制字段

转载 作者:行者123 更新时间:2023-12-04 23:02:03 25 4
gpt4 key购买 nike

我正在使用 PhoenixFramework 和库 Poison 。目前我正在开发 REST API。现在我需要以两种不同的方式对模型 Book 进行编码。

  1. 在仅包含基本信息的所有图书列表中 (GET/books)
  2. 包含所有信息的详细 View (GET/book/1)

获取/书籍

{
"books": [
{
"id": 1,
"name": "Book one"
},
{
"id": 2,
"name": "Book two"
},
// ...
]
}

GET/books/1

{
"book": {
"id": 1,
"name": "Book one",
"description": "This is book one.",
"author": "Max Mustermann",
// ...
}
}

Book的编码器

defimpl Poison.Encoder, for: MyProject.Book do

@attributes [:id, :name, :description, :author]

def encode(project, _options) do
project
|> Map.take(@attributes)
|> Poison.encode!
end
end

代码片段 Controller

def index(conn, _params) do
books = Repo.all(Book)
json(conn, %{books: books})
end

如何限制字段?我搜索诸如 :only:exclude 之类的选项。有人遇到过这个问题吗?

感谢您的帮助!

最佳答案

您可以使用render_many/4render_one/4 :

defmodule MyApp.BookView do

def render("index.json", %{books: books}) do
render_many(books, __MODULE__, "book.json")
end

def render("show.json", %{book: book}) do
render_one(book, __MODULE__, "full_book.json")
end

def render("book.json", %{book: book}) do
%{
id: book.id,
name: book.name
}
end


def render("full_book.json", %{book: book}) do
%{
id: book.id,
name: book.name,
description: description,
author: book.author
...
}
end
end

请注意,分配中的名称(渲染的第二个参数)由模块确定。请参阅Render many to many relationship JSON in Phoenix Framework有关使用不同名称的示例。

然后您可以使用以下方法从 Controller 调用此函数:

render(conn, "index.json", books: Repo.all(Book))

render(conn, "show.json", book: Repo.get(Book, 1))

关于json - JSON响应的限制字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35036732/

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