为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕斯709654 2021-10-31 10:13:05
所以我使用 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\"}"}]
查看完整描述

2 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

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;成为"Models.Event.Partyhat"


查看完整回答
反对 回复 2021-10-31
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

首先,代码有一个严重的错误。它不是访问 using 块中的流,而是访问最终将返回 ... 字符串的任务。然后它用 .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直接使用索引器和获取器。第二行用于.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; 

这将在返回实际值之前经过几个间接级别。源代码显示,转换实际上最终会调用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();


查看完整回答
反对 回复 2021-10-31
  • 2 回答
  • 0 关注
  • 316 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信