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 關注
- 394 瀏覽
添加回答
舉報