Ich habe Probleme mit einem Rails Serializer in einer API-App. Die App gibt ein JavaScript-Objekt zurück, bei dem die Schlüssel nicht in doppelte Anführungszeichen eingeschlossen sind. Beachten Sie, dass die Quell-API ein JavaScript-Objekt mit Schlüsseln zurückgibt, die nicht von Anführungszeichen umgeben sind.Rails Serializer gibt kein gültiges JSON zurück (Schlüssel nicht in Anführungszeichen)
Ich habe zwei Beiträge gefunden, die verwandt zu sein scheinen. Die zweite Antwort here stellt fest, dass, wenn Sie ein Objekt erhalten, das keine Zeichenfolge ist, Sie es nicht analysieren müssen, also denke ich, dass das hier vorgeht, aber ich kann nicht herausfinden, was ich anstelle von JSON.parse response
in meinem verwenden soll Modell. Ein weiterer verwandter Beitrag here; wie dort vorgeschlagen, habe ich versucht return JSON(response)
anstelle von JSON.parse response
, die auch nicht gültig JSON produzieren. Ich sehe, ich kann die each_serializer: KoboApiSerializer
Zeile in meinem Controller entfernen, und habe versucht, dies mit der `JSON (Antwort) Zeile im Modell zurückgeben.
Alle Vorschläge, was ich tun sollte, um ein gültiges JSON-Ergebnis zu erzeugen, wären willkommen.
Modell, Controller, zurückgegebener JSON und Quell-JSON, die von der API unten zurückgegeben wurden. Ich habe auch enthalten, was ist puts
'out zu meinem Terminal über die Leitung in meinem Controller. Danke im Voraus.
Modell:
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
Controller:
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
Beispiel Objekt zurückgegeben von meiner Rails API App
Ein Serializer an seinem Platz ist (hier „kobo_data "), so werden Objekte darunter gruppiert. Bin ein Beispiel-Objekt von denen zurückgegeben - beachten Sie, dass das Objekt hier nicht unbedingt mit denen übereinstimmen, die ich von der Quell-API oder von der Konsole veröffentlicht habe - bin es eingeschlossen, um zu zeigen, dass Schlüssel nicht in Anführungszeichen eingeschlossen sind.
{
kobo_data: [
{
lemurs_quantity: 20,
month_and_year: "2016-03-01",
lemur_category: "indri",
location_admin1: "toliara",
location_admin2: "androy"
}
]
}
Beispiel Quelle json von API:
Ein Gegenstand (der vielen) zurückgegeben von der Quelle API. Werte hier stimmen nicht mit den Werten überein, die über oder unter sind - ich schließe nur ein, um zu zeigen, dass Schlüssel nicht in doppelten Zitaten eingeschlossen sind.
[
{
location_admin1: "fianarantsoa",
location_admin2: "atsimo-atsinanana",
lemurs_quantity: "5",
month_and_year: "2016-01-01",
lemur_category: "brown_lemur",
},
]
Putsing es zum Terminal ....
Werte puts
‚ed über die Leitung in meiner Controller Show zu meinem Terminal, dass es erscheint ein gültiges JSON Objekt zu sein, mit den Schlüsseln in Zitate. Wie oben stimmen die Werte hier nicht mit den Werten aus meinen Quelldaten überein - dies soll nur zeigen, dass hier zurückgegebene Werte in Anführungszeichen eingeschlossen sind.
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"]]