[.NET]JValue.Parse JToken.Parse 在 async Method 中使用要小心

Newtonsoft.Json 使用的是 8.0.0.0 版本。

最近使用 JValue.Parse 將 json 字串轉成 dynamic 物件時,
在某個 method 中居然發生 CS1061 的錯誤,如下,
error CS1061: 'object' does not contain a definition for 'DeviceId' and no extension method 'DeviceId' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)    

測試的程式如下,

async static void JValueParseAsync()
{
	string xx = @"{
				  ""DeviceId"": ""dth22_0521"",
				  ""Temperature"": 17.731706424491342,
				  ""Humidity"": 0.23554805677176827,
				  ""Timestamp"": ""2016-01-21T01:33:02.6287983Z""
				}";
 
	dynamic dth22Async = JValue.Parse(xx);
	string t = dth22Async.DeviceId;
	await Task.FromResult<object>(null);
}

Debug發現 dth22Async 的 Type 不是 dynamic 而是 object,如下,

可是一樣的Code放在 Main 上執行,它的 Type 又是 dynamic,如下,

程式一樣,放置的地方不同,真的蠻奇怪的,唯一的差別就是 async ,

建立另一個 function ,不要使用 async ,如下,

static void JValueParse()
{
	string xx = @"{
				  ""DeviceId"": ""dth22_0521"",
				  ""Temperature"": 17.731706424491342,
				  ""Humidity"": 0.23554805677176827,
				  ""Timestamp"": ""2016-01-21T01:33:02.6287983Z""
				}";
	JObject dthObjAsync = JObject.Parse(xx);
	string b = (string)dthObjAsync["DeviceId"];

	dynamic dth22Async = JValue.Parse(xx);

	string t = dth22Async.DeviceId;
}

這樣 dth22Async 的 type 就是我們要的 dynamic. 

所以如果在 async method 中就先不要使用 JValue.Parse,改用 JObject.Parse 來撐一下吧,如下,

string xx = @"{
			  ""DeviceId"": ""dth22_0521"",
			  ""Temperature"": 17.731706424491342,
			  ""Humidity"": 0.23554805677176827,
			  ""Timestamp"": ""2016-01-21T01:33:02.6287983Z""
			}";
JObject dthObjAsync = JObject.Parse(xx);
string b = (string)dthObjAsync["DeviceId"];

 

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^