首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails序列化程序不返回有效的JSON (键不以引号返回)

Rails序列化程序不返回有效的JSON (键不以引号返回)
EN

Stack Overflow用户
提问于 2016-07-02 13:05:34
回答 1查看 369关注 0票数 0

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

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

对于我应该做些什么来产生一个有效的JSON结果的任何建议,我们将不胜感激。

模型、Controller、返回的JSON和从下面的API返回的源JSON。我还包括了通过我的控制器中的线路到达我的终端的puts。谢谢。

模型:

代码语言:javascript
复制
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

控制器:

代码语言:javascript
复制
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"),因此将对象分组。Am包括返回的示例对象(请注意这里的对象不一定与我从源API或控制台发布的对象相匹配),am包括它,以表明键不包含在引号中。

代码语言:javascript
复制
{
    kobo_data: [
        {
            lemurs_quantity: 20,
            month_and_year: "2016-03-01",
            lemur_category: "indri",
            location_admin1: "toliara",
            location_admin2: "androy"
        }
    ]
}

来自API:的源json的示例

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

代码语言:javascript
复制
[
    {
        location_admin1: "fianarantsoa",
        location_admin2: "atsimo-atsinanana",
        lemurs_quantity: "5",
        month_and_year: "2016-01-01",
        lemur_category: "brown_lemur",
    },
]

把它推到终端.

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

代码语言:javascript
复制
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"]]
EN

回答 1

Stack Overflow用户

发布于 2016-07-05 19:46:06

把这归因于缺乏经验。一切都很好--原来我是在查看浏览器显示的响应,而不是查看源代码。详情如下。

浏览器中显示的

代码语言:javascript
复制
{
    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"
        },
    ]
}

与源

代码语言:javascript
复制
{
    "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"
        },
    ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38160483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档