2013-05-30 2 views
1

Я пытаюсь получить ответ CouchDB от Redis - с помощью ServiceStack WebServices для доступа к данным, хранящимся через ServiceStack .Net RedisTypedClient на Redis.ServiceStack/Redis с Json over Http возвращает строку не Json

Теперь веб-службы описываются как предоставление слоя CouchDB для Redis. Однако, в отличие от эквивалентных вызовов CouchDB в CouchDB, я никогда не получаю json, но только строки - чтобы быть ясным, я возвращаюсь к json, но с полезной нагрузкой находится в строчном формате.

Это относится к получению предметов из коллекций Redis List, Set и HashSet. Все элементы через веб-службы xml, json или csv всегда доставляют полезную нагрузку в виде строки. Теперь я вижу сериализованную форму типа I, хранящуюся в строке - например, json-массив строк или что-то еще, но данные не передаются как json (или csv или xml), а как строка. Я не могу найти флаг запроса (.e.g. 'Format = json' say) в любой из автогенерированной документации для этих веб-сервисов, которая, как говорят, доставляет полезную нагрузку в виде строки, которая является тем, что я вижу.

Помимо использования стандартного jsv-сериализатора через RedisTypedCLient, я также попытался напрямую вызвать сериализатор селектора ServiceStack json для сериализации как json, а не jsv, а также сериализатор Newtonsoft json. Ничто из этого не имеет никакого значения. Я тоже этого не ожидал, полагая, что службы по умолчанию, скорее всего, будут управлять ожидаемой версией jsv и будут поставлять что-либо еще в виде строк. Однако я не ожидал этого из формата внутренней сериализации.

Возможно ли получить CouchDB как ответы json от ServiceStack/Redis/Builtin-WebServices?

Update

Вот типичный запрос через ServiceStack JSON веб-службы:

http://myserver.com/redis/json/syncreply/GetAllItemsFromList?id=test

Это коллекция Redis список, содержащий строго типизированные элементы:

type TestItem(gr,eType,pillar,offset) = 
    let mutable _gr  = gr  
    let mutable _eType = eType 
    let mutable _pillar = pillar 
    let mutable _offset = offset 
    member x.Gr  with get()= _gr  and set(v) = _gr  <- v 
    member x.EType with get()= _eType and set(v) = _eType <- v 
    member x.Pillar with get()= _pillar and set(v) = _pillar <- v 
    member x.Offset with get()= _offset and set(v) = _offset <- v 
    override x.ToString() = sprintf "%s %s %s %M" x.Gr x.EType x.Pillar x.Offset 

Коллекция списков была добавлена ​​с использованием интерфейса/API IRedisTypedClient Я ожидаю обратно json-список json-объектов - набор пар ключ/значение каждой пары, соответствующий одному из четырех общедоступных свойств в указанном выше типе. Вместо этого я получаю

{"Items":[" {\"Gr\":\"BON13\",\"EType\":\"MARKET\",\"Pillar\":\"BON3.R0\",\"Offset\":0.0}","{\"Gr\":\"BOQ13\",\"EType\":\"MARKET\",\"Pillar\":\"BOQ3.R0\",\"Offset\":0.0}","{\"Gr\":\"BOU13\",\"EType\":\"MARKET\",\"Pillar\":\"BOU3.R0\",\"Offset\":0.0}","{\"Gr\":\"BOV13\",\"EType\":\"SETTLEPILLAR\",\"Pillar\":\"BOU3.R0\",\"Offset\":0.0}","{\"Gr\":\"BOZ16\",\"EType\":\"SETTLEPILLAR\",\"Pillar\":\"BOU3.R0\",\"Offset\":0.0}"],"ResponseStatus":{}} 

Другими словами, строковое представление объекта json не является самим объектом json.

Итак, как я могу вернуть в этом случае список json-объектов json-объектов, а не список строк json. (И то же самое относится к наборам, словарям и более базовым ключам json documents a la other NoSql dbs)?

У меня такие же проблемы, как возврат csv - он возвращается как строка, а не как csv пар ключ/значение или csv ключей и значений, а в XML, где это снова возвращается как строка, а не а не XML-формат пар ключ/значение.

Update 1

Он не должен быть сильно типизированных, как указано выше. Это может быть список списка строк. В этом случае я возвращаю список строк json, а не список json, содержащий элементы, содержащие список строк json.

Update 2 Хотя проблема ясно, как представляется, в реализации вебсервис ServiceStack не будучи, как CouchDB хотя он утверждает, что это, вот некоторые примеры кода, чтобы поместить данные в Redis с помощью ServiceStack.

open System 
open System.Collections.Generic 
open ServiceStack.Redis 
open System.Linq 

type Repository() =  
    static let mutable __port = 6379   
    static let mutable __host = "myserver.com" 
    static let mutable __client = new RedisClient(__host,__port) 
    static member Client = __client :> IRedisClient 

type Repository<'T>() = 
    let _client = Repository.Client 
    member x.GetList key = 
     use client = _client.As<'T>() 
     match _client.GetEntryType key with 
     | RedisKeyType.List -> 
      client.Lists.Item key |> client.GetAllItemsFromList 
     | _ -> new List<'T>()  
    member x.SetList (key, values: List<'T>) = 
     if (values.Count <> 0) then 
      use client = _client.As<'T>() 
      let list = client.Lists.Item key 
      values |> Seq.iter (fun x -> client.AddItemToList(list, x))  

Использование

let repo = new Repository<List<string>> 
let items = [["key0";"data0"];["key1";"data1"]] 
      |> Seq.map (fun kd -> List.init kd)) 
      |> List.init 
repo.SetList("test",items)  

просто вырезать и вставить более длинного кода. Я пробовал это в C#, f # и без сериализации по умолчанию, как уже было сказано. То есть я пробовал шесть разных методов на сегодняшний день, и ни одна из них не доставила данных как объекты json через ServiceStack WebServices только как строки.

+0

Просьба показать код –

+0

Нет кода для отображения. Речь идет о стандартных ответах встроенных вызовов ServiceStack json webservice, которые производят строки не json. Я хочу знать, как заставить его предоставить json, например, предположительно некоторый флаг, который отсутствует в автоматической документации. –

+0

Почему вы говорите, что он возвращает строку? Можете ли вы хотя бы добавить URL-адрес, который вы используете, и ответ, который вы получили? Может быть, служба возвращает объект json, но ваш браузер отображает его как строку? –

ответ

1

Данные JSON, когда они сериализованы и отправлены по проводам, являются просто строкой. Ваш клиент должен быть осведомлен о JSON и де-сериализовать его в свой объект. JsonClient для C# в ServiceStack более чем способен обрабатывать это, а также множество фреймворков JavaScript, которые помогают в вызовах AJAX (jQuery, AngularJS и т. Д.).

+0

Я использую клиентские json-инструменты, как указано в вышеприведенном комментарии, и эти инструменты отлично работают с CouchDB и многими другими json через http-сервисы, которые я потребляю. Ни один из этих инструментов не работает с выходом из Redis/ServiceStack, поскольку он поставляется как строка не json с удвоенными кавычками и экранированными кавычками в полезной нагрузке. Как получить возвращаемые значения ServiceStack как json? –

+0

Некоторые примеры ответов были бы полезны для устранения неполадок - прямо сейчас я запускаю службу ServiceStack и не испытываю никаких проблем с возвратом JSON. –

+0

См. Расширенный вопрос. –

Смежные вопросы