2016-07-02 24 views
0

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"]] 

Antwort

0

Kreide bis zur Unerfahrenheit. Alles funktionierte einwandfrei - es stellte sich heraus, dass ich die Antwort wie in meinem Browser angezeigt und nicht die Quelle angezeigt habe. Details unten.

Wie in Browser angezeigt

{ 
    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" 
     }, 
    ] 
} 

vs. Quelle

{ 
    "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" 
     }, 
    ] 
}