【问题标题】:Rails Serializer not returning valid JSON (keys not returned in quotes)Rails 序列化程序未返回有效 JSON(未在引号中返回的键)
【发布时间】:2016-07-02 13:05:34
【问题描述】:

在仅 API 的应用程序中使用 Rails 序列化程序时遇到了一些问题。该应用程序正在返回一个 javascript 对象,其中键未包含在双引号中。值得注意的是,源 API 返回一个 javascript 对象,其中的键没有被引号包围。

我发现了两个似乎相关的帖子。第二个答案here 指出,如果你收到一个不是字符串的对象,你不需要解析它,所以我猜这就是这里发生的事情,但我不知道用什么代替@ 987654323@ 在我的模型中。另一个相关帖子here;正如那里所建议的那样,我尝试了return JSON(response) 而不是JSON.parse response,这也没有产生有效的JSON。我看到我可以删除控制器中的 each_serializer: KoboApiSerializer 行,并尝试使用模型中的 `return JSON(response) 行来做到这一点。

任何关于我应该如何生成有效 JSON 结果的建议将不胜感激。

模型、控制器、返回的 JSON 和从下面的 API 返回的源 JSON。我还通过我的控制器中的线路将puts'd 包含在我的终端中。提前致谢。

型号:

class KoboApi < ActiveRecord::Base
    require 'rest_client'
    USERNAME = ENV['KOBO_API_USER']
    PASSWORD = ENV['KOBO_API_PWD']
    SURVEY = ENV['KOBO_API_SURVEY']
    API_BASE_URL = ENV['API_BASE_URL']
    def self.get_api_info
        uri = "#{API_BASE_URL}/data/#{SURVEY}?format=json"
        rest_resource = RestClient::Resource.new(uri, USERNAME, PASSWORD)
        response = rest_resource.get
        JSON.parse response
    end
end

控制器:

class KoboDataController < ApplicationController
    def index
        @kobo_info = KoboApi.get_api_info
        puts "@kobo_info: #{@kobo_info.inspect}" #values for this returned below.  this shows keys surround with quotes.
        @kobo_info.each do |kobo_info|
           #some records have NULL for the month_and_year date field.  this if then statement 
           date = if kobo_info['month_and_year']
                Date.parse(kobo_info['month_and_year'])
           else
                nil
           end
            KoboApi.where(lemurs_quantity: kobo_info['lemurs_quantity'], month_and_year: date, lemur_category: kobo_info['lemur_category'], location_admin1: kobo_info['location_admin1'], location_admin2: kobo_info['location_admin2']).first_or_create
        end
    render(
      json.KoboApi.all,
      each_serializer: KoboApiSerializer
    )
    end
end

从我的 Rails API 应用返回的对象示例

有一个序列化程序(这里是“kobo_data”),所以对象被分组在它下面。我包括来自返回的示例对象 - 请注意,这里的对象不一定与我从源 API 或控制台发布的对象相匹配 - 包括它以表明键未包含在引号中。

{
    kobo_data: [
        {
            lemurs_quantity: 20,
            month_and_year: "2016-03-01",
            lemur_category: "indri",
            location_admin1: "toliara",
            location_admin2: "androy"
        }
    ]
}

来自 API 的源 json 示例:

从源 API 返回的一个(众多)对象。这里的值与上面或下面的值不匹配 - 只是为了表明键没有用双引号括起来。

[
    {
        location_admin1: "fianarantsoa",
        location_admin2: "atsimo-atsinanana",
        lemurs_quantity: "5",
        month_and_year: "2016-01-01",
        lemur_category: "brown_lemur",
    },
]

把它放到终端......

puts'通过我的控制器中的行输出到我的终端表明它似乎是一个有效的 JSON 对象,带有引号中的键。如上所述,此处的值与我的源数据中的值不匹配 - 这只是为了表明此处的返回值包含在引号中。

Processing by KoboDataController#index as HTML
@kobo_info: [{"location_admin1"=>"fianarantsoa", "location_admin2"=>"atsimo-atsinanana","lemurs_quantity"=>"5", "month_and_year"=>"2016-01-01","lemur_category"=>"brown_lemur"}

KoboApi Load (0.3ms)  SELECT  "kobo_apis".* FROM "kobo_apis" WHERE "kobo_apis"."lemurs_quantity" = $1 AND "kobo_apis"."month_and_year" = $2 AND "kobo_apis"."lemur_category" = $3 AND "kobo_apis"."location_admin1" = $4 AND "kobo_apis"."location_admin2" = $5  ORDER BY "kobo_apis"."id" ASC LIMIT 1  [["lemurs_quantity", 5], ["month_and_year", "2016-01-01"], ["lemur_category", "brown_lemur"], ["location_admin1", "fianarantsoa"], ["location_admin2", "atsimo-atsinanana"]]

【问题讨论】:

    标签: ruby-on-rails json active-model-serializers


    【解决方案1】:

    将此归咎于缺乏经验。一切正常 - 事实证明我正在查看浏览器显示的响应,而不是查看源代码。详情如下。

    在浏览器中显示

    {
        kobo_data: [
            {
                lemurs_quantity: 1,
                month_and_year: "2013-06-01",
                lemur_category: "no_response",
                location_admin1: "antsiranana",
                location_admin2: "diana"
            }, {
                lemurs_quantity: 1,
                month_and_year: "2013-06-01",
                lemur_category: "no_response",
                location_admin1: "antsiranana",
                location_admin2: "diana"
            },
        ]
    }
    

    对比来源

    {
        "kobo_data": [
            {
                "lemurs_quantity": 1,
                "month_and_year": "2013-06-01",
                "lemur_category": "no_response",
                "location_admin1": "antsiranana",
                "location_admin2": "diana"
            }, {
                "lemurs_quantity": 1,
                "month_and_year": "2013-06-01",
                "lemur_category": "no_response",
                "location_admin1": "antsiranana",
                "location_admin2": "diana"
            },
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多