C#从JSON格式的字符串中检索JSON格式的字符串

时间:2018-07-26 07:41:54

标签: c# json json.net

所以我正在使用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\"}"}]

2 个答案:

答案 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相同的对象;

如果有效载荷不是字符串,则:

  1. 不需要这个问题
  2. 。隐式强制转换(即序列化回字符串)有效时,简单类型的值失败
  3. .Value和隐式强制转换均失败,例如{\"type\":\"Models.Event.Partyhat\",\"Id\":\"123\"}

因此,无论使用哪种方法,请注意JSON负载。

如果不确定,可以将有效负载转换为字符串:

string payloadString=jsonArray[0].payload.ToString();

var payloadObject=jsonArray[0].payload.ToString();