Я пытаюсь получить ответ 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 только как строки.
Просьба показать код –
Нет кода для отображения. Речь идет о стандартных ответах встроенных вызовов ServiceStack json webservice, которые производят строки не json. Я хочу знать, как заставить его предоставить json, например, предположительно некоторый флаг, который отсутствует в автоматической документации. –
Почему вы говорите, что он возвращает строку? Можете ли вы хотя бы добавить URL-адрес, который вы используете, и ответ, который вы получили? Может быть, служба возвращает объект json, но ваш браузер отображает его как строку? –