所以我正在使用HttpClient
来检索HttpResponseMessage
,在这里我以字符串形式读取内容:
using (var responseStream = response.Content.ReadAsStringAsync())
{
var streamContent = responseStream.Result;
}
现在,streamContent
似乎是JSON格式的字符串,但我想了解的是payload
,它又似乎是JSON格式的字符串。 JSON可视化工具(VS)为我提供了这一点:
[JSON]
[0]
payload_bytes: 201
payload: "{"type":"Models.Event.Partyhat","Id":"123"}"
我在进入payload
时遇到了一些麻烦,更不用说驻留在其中的JSON字符串了。我尝试摆弄JsonConvert
,但这并没有太大帮助。
有任何提示吗?
编辑:
我反序列化的尝试:
var streamContent = JsonConvert.DeserializeObject<object>(responseStream.Result);
编辑2:
可能值得添加实际的字符串:
[{"payload_bytes":201,"payload":"{\"type\":\"Models.Event.Partyhat\",\"Id\":\"123\"}"}]
答案 0 :(得分:3)
... x264enc ! video/x-h264, profile=main ! mpegtsmux ...
这使您string jsonText = ...;
dynamic root = JsonConvert.DeserializeObject(jsonText);
string payloadText = root[0].payload; // do not use 'var' here
dynamic payload = JsonConvert.DeserializeObject(payloadText);
为string typeText = payload.type;
答案 1 :(得分:2)
首先,该代码有一个严重的错误。它不是访问using块中的流,而是访问 task ,该任务最终将返回一个...字符串。然后使用.Result 阻止呼叫。
代码应如下所示:
using (var json= await response.Content.ReadAsStringAsync())
{
var jsonArray=JsonConvert.DeserializeObject<dynamic>(json);
var payloadObject=jsonArray[0].payload;
var payload=JsonConvert.DeserializeObject<dynamic>(payloadObject.Value);
}
如果调用方法不是异步的,则应将其转换为一个。
通过反序列化为dynamic
,您可以直接使用索引器和.payload
getter。第二行使用.Value
提取有效载荷文本,以便也可以反序列化。
您可以直接从响应流中反序列化,而不必将所有内容读取为字符串。这在处理大型响应时非常有用,因为您可以避免在反序列化之前将整个响应作为字符串缓存。
var serializer = new JsonSerializer();
using (var stream= await response.Content.ReadAsStreamAsync())
using (var sr = new StreamReader(stream))
using (var jsonTextReader = new JsonTextReader(sr))
{
var jsonArray=JsonConvert.DeserializeObject<dynamic>(json);
var payloadObject=jsonArray[0].payload;
var payload=JsonConvert.DeserializeObject<dynamic>(payloadObject.Value);
}
一个小警告
仅在值实际上是字符串的情况下使用.Value
才有效,但是非常便宜。 JValue.Value的源代码表明,它以object
的形式返回了所有内容,而没有进行任何转换。
强制转换为字符串也仅适用于字符串和简单类型:
string payloadObject=jsonArray[0].payload;
在返回实际值之前,这将经历几个间接级别。
源代码显示casting实际上最终调用了Convert.ToString(v.Value, CultureInfo.InvariantCulture)
,实际上是a call to ToString(CultureInfo.InvariantCulture)
最后,它将返回与.Value
相同的对象;
如果有效载荷不是字符串,则:
{\"type\":\"Models.Event.Partyhat\",\"Id\":\"123\"}
因此,无论使用哪种方法,请注意JSON负载。
如果不确定,可以将有效负载转换为字符串:
string payloadString=jsonArray[0].payload.ToString();
或
var payloadObject=jsonArray[0].payload.ToString();