简体   繁体   中英

Can't get values from json stored in database

I'm trying to write app which logs json msgs to db. That part I got. The problem comes with getting that json back. I can't get values from it. I've tried to get raw msgs from db and getting values from this ( json gem seems not to see it as json) I've tried to parse it via .to_json , but it doesn't seem to work either. Maby you have some idea how to get it? Thanks in advance

table:

mjl_pk  bigserial
mjl_body    text <- JSON is stored here
mjl_time    timestamp
mjl_issuer  varchar
mjl_status  varchar
mjl_action  varchar
mjl_object  varchar
mjl_pat_id  varchar
mjl_stu_id  varchar

code:

#Include config catalog, where jsonadds is
$LOAD_PATH << 'config'

#Requirements
require 'sinatra'
require 'active_record'
require 'json'
require 'jsonadds'
require 'RestClient'

#Class for db
class Mjl < ActiveRecord::Base
#table name
  self.table_name = "msg_json_log"
#serialization
  serialize :properties, JSON
#overwrite ActiveRecord id with "mjl_pk"
  def self.primary_key
    "mjl_pk"
  end
end

#Get json msg and write it to db
post '/logger' do
  content_type :json
#Check if msg is json
  if JSON.is_json?(params[:data])
#insert data into db
    msg = Mjl.create(:mjl_body => params[:data] ,:mjl_issuer => 'LOGGER', :mjl_action => 'test', :mjl_object =>'obj')
  else
#else return error    
    puts "Not a JSON \n" + params[:data]
  end
end

#Get json with id = params[:id]
get '/json/:id' do
  content_type :json
#Get json from db
  json_body = Mjl.where(mjl_pk: params[:id]).pluck(:mjl_body)
  puts json_body
  json_body = json_body.to_json
  puts json_body
#Get 'patientData' from json
  puts json_body['key']
  puts json_body[0]['key']
end

Output:

{
"key": "I am a value",
"group": {
  "key2": "Next value",
  "key3": "Another one"
  },
  "val1": "Val"
}
["{\n    \"key\": \"I am a value\",\n    \"group\": {\n        \"key2\": \"Next value\",\n        \"key3\": \"Another one\"\n    },\n    \"val1\": \"Val\"\n}"]
key
 <--empty value from 'puts json_body[0]['key']'

I've also created a JSON Log in my project like this, this might help you...

In Controller

current_time = Time.now.strftime("%d-%m-%Y %H:%M")
@status_log = {}
@arr = {}
@arr[:status_id] = "2.1"
@arr[:status_short_desc] = "Order confirmed"
@arr[:status_long_desc] = "Order item has been packed and ready for shipment"
@arr[:time] = current_time
@status_log[2.1] = @arr
@status_log_json = JSON.generate(@status_log)
StoreStock.where(:id => params[:id]).update_all(:status_json => @status_log_json)

In View

@json_status = JSON.parse(ps.status_json)  # ps.status_json contails raw JSON Log

= @json_status['2.1']['status_long_desc'] 

Hope this might help you.

when you are doing

json_body = Mjl.where(mjl_pk: params[:id]).pluck(:mjl_body)

you already have json so no need doing

 json_body = json_body.to_json

Since doing this you get the string representation of json, just remove that line and you will get all the values.

Finally I've found how to do it.
I saw explanation on JSON methods at:
from json to a ruby hash?
Code which works for me:

  json_body = Mjl.where(mjl_pk: params[:id]).pluck(:mjl_body)
  puts json_body
  jparsed = JSON.parse(json_body[0])
  puts jparsed['key']

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM