亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 394 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號