парсинг веб-клиента. Результат содержимого в OPA - PullRequest
2 голосов
/ 08 января 2012

Я пытаюсь использовать модуль webclient для запроса интерфейса покоя couchDB (я использую его вместо opa couchdb api, потому что мне нужно получить определенное количество документов).

Вот код, используемый для запроса:

listmydocs(dburi)=
match  WebClient.Get.try_get(dburi) with
      | { failure = _ } -> print("error\n")
      | {success=s} ->  match WebClient.Result.get_class(s) with
          | {success} -> print("{s.content}")                               
          | _         -> print("Error {s.code}")
      end

результат, указанный в s.content, представляет собой следующую строку:

{"total_rows":177,"offset":0,"rows":[
{"id":"87dc6b6d9898eff09b1c8602fb00099b","key":"87dc6b6d9898eff09b1c8602fb00099b","value":{"rev":"1-853bd502e3d80d08340f72386a37f13a"}},
{"id":"87dc6b6d9898eff09b1c8602fb000f17","key":"87dc6b6d9898eff09b1c8602fb000f17","value":{"rev":"1-4cb464c6e1b773b9004ad28505a17543"}}
]}

Мне было интересно, как лучше всего проанализировать эту строку, чтобы получить, например, список идентификаторов или только поле строк? Я пытался использовать Json.deserialize (s.content), но не уверен, куда идти.

1 Ответ

3 голосов
/ 09 января 2012

Вы можете иметь несколько подходов к двум несериализованным строкам Json в Opa:

1 - Первый из них - просто использовать Json.deserialize, который принимает строку и создает Json AST в соответствии со спецификацией Json. Затем вы можете сопоставить полученный AST, чтобы получить необходимую информацию.

match Json.deserialise(a_string) with
| {none} -> /*Error the string doesn't respect json specification*/
| {some = {Record = record}} ->
/* Then if you want 'total_rows' field */
  match List.assoc("total_rows", record) with
  | {some = {Int = rows}} -> rows
  | {none} -> /*Unexpected json value*/

2 - Другой подход - использовать «волшебную» опесерилизацию от Json. Прежде всего определите тип Opa, соответствующий ожидаемому значению. Затем используйте функцию OpaSerialize. *. По вашему примеру

type result = {
  total_rows : int;
  offset : int;
  rows : list({id:string; key:string; value:{rev:string}})
}
match Json.deserialize(a_string)
| {none} -> /*Error the string doesn't respect json specification*/
| {some = jsast} ->
  match OpaSerialize.Json.unserialize_unsorted(jsast) with
  | {none} -> /*The type 'result' doesn't match jsast*/
  | {some = (value:result) /*The coercion is important, it give the type information to serialize mechanism*/} ->
    /* Use value as a result record*/
    value.total_rows
...