首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Elixir -将http响应json转换为ecto.schema对象

Elixir -将http响应json转换为ecto.schema对象
EN

Stack Overflow用户
提问于 2020-04-14 09:14:39
回答 1查看 633关注 0票数 0

我是长生不老药的新手。我有一个Ecto模式

代码语言:javascript
运行
AI代码解释
复制
  defmodule MyScoreSchema do
  use Ecto.Schema
  import Ecto.Changeset

  schema "historical_extra_fuels" do
    field :average, :float
    field :count, :float
    field :percent, :float
    field :name, :string
  end


  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:average, :count, :percent])
    |> validate_required([])
  end
end

和父架构

代码语言:javascript
运行
AI代码解释
复制
defmodule OverallScore do
  use Ecto.Schema
  import Ecto.Changeset

  schema "OverallScore" do
    field :avg_pass, :float
    field :avg_fail, :float
    field :total_students, :float
    embeds_many :my_score_schema, MyScoreSchema
  end
  @required_fields ~w[]a
  @optional_fields ~w[avg_pass, avg_fail, total_students ]a


  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, @optional_fields, required: false )
    |> cast_embed(:my_score_schema, required: false)
  end
end

并拥有一个HTTP REST API http://localhost:8080/getScoreData,它提供数据

代码语言:javascript
运行
AI代码解释
复制
{
      "avgPass": 85.55,
      "avgFail": 14.45,
      "totalStudents": 80.0,
      "myScoreSchema": [
        {
          "average": 80.0,
          "count": 8.0,
          "percent": 80.0,
          "name": "John"
        },
        {
          "average": 90.0,
          "count": 8.0,
          "percent": 90.0,
          "name": "Cena"
        },
        {
          "average": 80.0,
          "count": 8.0,
          "percent": 80.0,
          "name": "Sunny"
        },
        {
          "average": 70.0,
          "count": 8.0,
          "percent": 70.0,
          "name": "Michael"
        }
      ]
    }

和代码

代码语言:javascript
运行
AI代码解释
复制
  url = "http://localhost:8080/getScoreData"
   Logger.info("the url is #{url}")
   case HTTPoison.get(url) do
     {:ok, %{status_code: 200, body: body}} ->
       overall_score = Jason.decode!(body, as: [%OverallScore{}])
       {:ok, overall_score}
   end

这以某种方式工作,不会产生错误,但结果是一些struct,而不是真正的OverallScore ecto schema object

EN

回答 1

Stack Overflow用户

发布于 2020-04-14 10:23:16

我建议您在模型中使用已有的变更集,而不是使用"as:%OverallScore{}“语法。这看起来像这样:

代码语言:javascript
运行
AI代码解释
复制
  url = "http://localhost:8080/getScoreData"
   Logger.info("the url is #{url}")
   case HTTPoison.get(url) do
     {:ok, %{status_code: 200, body: body}} ->
       response = Jason.decode!(body)
       overall_score = OverallScore.changeset(%OverallScore{}, response)
       {:ok, overall_score}
   end

变更集通常是将对象放入ecto结构的最佳方式,因为它们将正确地运行您的变更集验证。这还有一个额外的好处,那就是它可以在"response“字段中删除任何不在变更集的cast调用中的内容,而不会出现任何错误。您还可以快速检查它是否有效,如果是,您可以使用ecto repo将其插入到数据库中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61204295

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文