将字符串转换为映射?
问题描述:
我正在使用http客户端通过http请求调用服务器,问题是如何将响应中的结果体转换为地图?将字符串转换为映射?
我得到的结果是:
"{status: 'ok'}"
我需要做的图案匹配,并从上面的字符串中提取状态值。
有什么想法?
答
由于Dogbert指出,你所得到的回应是不有效的JSON。所以,你的第一步是把它变成一个正确的格式:
iex(3)> s = "{status: 'ok'}"
"{status: 'ok'}"
iex(4)> b = Regex.replace(~r/([a-z0-9]+):/, s, "\"\\1\":")
"{\"status\": 'ok'}"
iex(5)> json = b |> String.replace("'", "\"") |> Poison.decode!
%{"status" => "ok"}
的正则表达式在双引号冒号前包裹字/位combintation。然后将其余的单引号替换为双引号。这可以由Poison解析。
然后第二步是提取你想要的信息。这可以使用模式匹配来完成:
iex(8)> %{"status" => resultString} = json
%{"status" => "ok"}
iex(9)> resultString
"ok"
答
首先,你可能会想,构建有效的JSON像这样:
~s({"status": "ok"})
通知乐于助人的~s
印记,让你不用担心转义双引号,这是在JSON的必需品。
然后,你可以简单地利用Poison解析到地图(或结构,如果你想)和模式匹配,像这样:
%{"status" => status} = Poison.Parser.parse! ~s({"status": "ok"})
服务器说它打印该值的格式是什么? (这不是有效的JSON。) – Dogbert
响应内容类型是'text/html',我正在手动构建json – simo