C# Newtonsoft.Json反序列化为dynamic对象之后的使用

通过Newtonsoft.Json将一个json类型的字符串反序列化为dynamic后直接使用报错

源代码:

namespace ConsoleApplication1
{

    class Program
    {
        static void Main()
        {
            var data = "{\"C_Describe\":\"测试\",\"FY_Subtitle\":\"测试\",\"MAX_ZJ\":20000,\"HType\":\"WFB\",\"communityID\":\"28075\",
              \"FY_id\":110352,\"areaID\":11,\"IsPublisher\":\"0\",\"attURL\":\"\"}
"; dynamic jsonData = FromJson<dynamic>(data); if (ContainChinese(jsonData.FY_Subtitle_CN)) Console.WriteLine("1"); if (ContainChinese((dynamic)jsonData.FY_Subtitle)) Console.WriteLine("2"); Console.ReadKey(); } /// <summary> /// 判断是否包含中文 /// </summary> /// <param name="CString"></param> /// <returns></returns> public static bool ContainChinese(string CString) { return Regex.IsMatch(CString??"", @"[\u4e00-\u9fbb]"); } /// <summary> /// 将json字符串反序列化为dynamic类型 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="jsonText"></param> /// <returns></returns> public static T FromJson<T>(string jsonText) { var json = new JsonSerializer { NullValueHandling = NullValueHandling.Ignore, ObjectCreationHandling = ObjectCreationHandling.Replace, MissingMemberHandling = MissingMemberHandling.Ignore, ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; var sr = new StringReader(jsonText); var reader = new JsonTextReader(sr); var result = (T)json.Deserialize(reader, typeof(T)); reader.Close(); return result; } } }

解决方法

在调用通过json反序列化的dynamic对象时,要先强制转换为对应的类型

代码:

if (ContainChinese((jsonData.FY_Subtitle_CN ?? "").ToString()))
    Console.WriteLine("1");
if (ContainChinese((jsonData.FY_Subtitle ?? "").ToString()))
    Console.WriteLine("2");

 

posted @ 2019-02-12 16:37  zhyue93  阅读(2418)  评论(0编辑  收藏  举报