2 回答
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"
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();
- 2 回答
- 0 关注
- 316 浏览
添加回答
举报