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:從零開始的軟體開發生活」
請大家繼續支持 ^_^