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

所以我使用 anHttpClient来检索 an 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\"}"}]


慕斯709654
浏览 317回答 2
2回答

HUH函数

string jsonText = ...;dynamic root = JsonConvert.DeserializeObject(jsonText);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;string payloadText = root[0].payload;&nbsp; // do not use 'var' heredynamic payload = JsonConvert.DeserializeObject(payloadText);&nbsp; &nbsp; &nbsp; &nbsp;这让你string typeText = payload.type;成为"Models.Event.Partyhat"

慕运维8079593

首先,代码有一个严重的错误。它不是访问 using 块中的流,而是访问最终将返回 ... 字符串的任务。然后它用 .Result阻止调用。代码应如下所示:using (var json= await response.Content.ReadAsStringAsync()){&nbsp; &nbsp; var jsonArray=JsonConvert.DeserializeObject<dynamic>(json);&nbsp; &nbsp; var payloadObject=jsonArray[0].payload;&nbsp; &nbsp; var payload=JsonConvert.DeserializeObject<dynamic>(payloadObject.Value);}如果调用方法不是异步的,则应将其转换为一种。通过反序列化,dynamic您可以.payload直接使用索引器和获取器。第二行用于.Value提取有效负载文本,以便也可以对其进行反序列化。您可以直接从响应流中反序列化,而不是将所有内容作为字符串读取。这在处理大型响应时很有用,因为在反序列化之前避免将整个响应缓存为字符串。var serializer = new JsonSerializer();using (var stream= await response.Content.ReadAsStreamAsync())using (var sr = new StreamReader(stream))using (var jsonTextReader = new JsonTextReader(sr)){&nbsp; &nbsp; var jsonArray=JsonConvert.DeserializeObject<dynamic>(json);&nbsp; &nbsp; var payloadObject=jsonArray[0].payload;&nbsp; &nbsp; var payload=JsonConvert.DeserializeObject<dynamic>(payloadObject.Value);}一个小警告使用.Value仅当值实际上是一个字符串的工作,但它会很便宜。JValue.Value的源代码显示它返回所有内容,object没有任何转换。转换为字符串也仅适用于字符串和简单类型:string payloadObject=jsonArray[0].payload;&nbsp;这将在返回实际值之前经过几个间接级别。源代码显示,转换实际上最终会调用Convert.ToString(v.Value, CultureInfo.InvariantCulture)它实际上是对 ToString(CultureInfo.InvariantCulture) 的调用最后,它将返回与.Value;相同的对象。如果有效负载不是字符串,则:没有必要问这个问题.Value 对于简单类型失败,而隐式转换(即序列化回字符串)有效.Value 和隐式转换对于对象都失败,例如 {\"type\":\"Models.Event.Partyhat\",\"Id\":\"123\"}因此,无论您使用哪种方法,都要小心 JSON 有效负载。如果您不能确定,则无论如何都可以将有效负载转换为字符串:string payloadString=jsonArray[0].payload.ToString();或者var payloadObject=jsonArray[0].payload.ToString();
打开App,查看更多内容
随时随地看视频慕课网APP