凤凰城

时间:2017-09-09 19:44:08

标签: json elixir phoenix-framework

菲尼克斯似乎有一种非传统的方式来序列化JSON(无论如何它对我来说都是新的)。例如,假设我有一个包含两列的表 - id和name。在几乎所有其他Web框架中,对show endpoint的响应将返回如下所示的JSON:

{
    "id": 1,
    "name": "foo"
}

使用Phoenix生成器,响应如下:

{
    "data": 
    {
        "id": 1,
        "name": "foo"
    }
}

我发现POST有类似问题,我需要发布{"company": { "name": "foo" } }而不是{ "name": "foo" }

我有两个问题:

  1. 以我不知道的方式序列化JSON是否有优势?
  2. 有没有办法在" normal"中处理JSON序列化?方式如上所述?

2 个答案:

答案 0 :(得分:1)

  1. 我认为这取决于个人偏好。

  2. 你当然可以改变它。

  3. 在生成的视图中,从

    更改它
    def render("show.json", %{id: id, name: name}) do
      %{
        data: %{
          id: id,
          name: name
        }
      }
    end
    

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

    在你的控制器函数中接受JSON:

    def create(conn, %{"company" => %{"name" => name}}) do
      ...
    end
    

    def create(conn, %{"name" => name}) do
      ...
    end
    

    您生成的函数可能看起来不同,但我认为您明白了这一点。

答案 1 :(得分:1)

发布Phoenix 1.3.0的差异生成代码,以便它可以帮助其他人:

控制器更改

-  def create(conn, %{"company" => company_params}) do
+  def create(conn, company_params) do

-  def update(conn, %{"id" => id, "company" => company_params}) do
-    company = Repo.get!(Company, id)
+  def update(conn, company_params) do
+    company = Repo.get!(Company, conn.path_params["id"])

查看更改

   def render("index.json", %{companies: companies}) do
-    %{data: render_many(companies, ConstructApi.CompanyView, "company.json")}
+    render_many(companies, ConstructApi.CompanyView, "company.json")
   end

   def render("show.json", %{company: company}) do
-    %{data: render_one(company, ConstructApi.CompanyView, "company.json")}
+    render_one(company, ConstructApi.CompanyView, "company.json")
   end