苏飞论坛广告位

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

分布式系统框架(V1.3) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程 - 订阅更新

HttpHelper万能框架(V2.2) HttpHelper官方出品,无敌框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V1.9) 最牛的爬虫类,没有爬不到只有想不到 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 12820|回复: 16

[教程] 将指定的Json字符串转为指定的T类型对象

[复制链接]
  • TA的每日心情
    开心
    昨天 09:37
  • 签到天数: 568 天

    [LV.9]以坛为家II

    发表于 2014-9-10 15:13:35 | 显示全部楼层 |阅读模式
    导读部分

    【HttpHelper万能框架】教程目录贴  http://www.sufeinet.com/thread-9989-1-1.html


    教程部分


    在我们使用万能框架抓取数据时,我相信用的最多的一种格式可能就是Json格式了。因为大部分Ajax是采用的这种格式。
    今天万能框架帮助您实现一个将Json转为对象的方法。
    也就是说根据Json要吧自动生成一个对象出来。
    大家就可以随意的调用了。
    再也不用对疼使用正则怎么分析了。

    使用之前先引用命名空间
    [C#] 纯文本查看 复制代码
    using CsharpHttpHelper;


    1.先来看一下简单类型的Json数据
    Json数据如下
    [C#] 纯文本查看 复制代码
    {
        "Stationmaster": "苏飞",
        "Domain": "www.sufeinet.com",
        "SiteName": "苏飞论坛"
    }


    如果要得到一个对象,那么我们得先定义这样一个类,对应的类文件如下
    [C#] 纯文本查看 复制代码
     
    public class SiteInfo
        {
            /// <summary>
            /// 网站站长
            /// </summary>
            public string Stationmaster { get; set; }
            /// <summary>
            /// 网站域名
            /// </summary>
            public string Domain { get; set; }
            /// <summary>
            /// 网站名称
            /// </summary>
            public string SiteName { get; set; }
        }


    下面看看万能框架是怎么帮助我们转化的吧
    [C#] 纯文本查看 复制代码
                string strjson = "{\"Stationmaster\":\"苏飞\",\"Domain\":\"www.sufeinet.com\",\"SiteName\":\"苏飞论坛\"}";
    
                SiteInfo objjson = (SiteInfo)HttpHelper.JsonToObject<SiteInfo>(strjson);


    执行效果
    QQ截图20140910150805.jpg

    很简单吧。

    这个只是一个简单Json数据类型
    2.复杂Json类型也是一样解析
    比如如下Json格式
    [C#] 纯文本查看 复制代码
    [
        {
            "Stationmaster": "苏飞",
            "Domain": "www.sufeinet.com",
            "SiteName": "苏飞论坛"
        },
        {
            "Stationmaster": "李彦宏",
            "Domain": "www.baidu.com",
            "SiteName": "百度"
        },
        {
            "Stationmaster": "马云",
            "Domain": "www.taobao.com",
            "SiteName": "淘宝"
        }
    ]

    这个增长了吧。也是一样解析,看下面方法

    当然这个还是使用上面的那个类。只是现在是一个集合。
    代码如下
    [C#] 纯文本查看 复制代码
                StringBuilder sb = new StringBuilder();
                sb.Append("[");
                sb.Append("    {");
                sb.Append("        \"Stationmaster\": \"苏飞\",");
                sb.Append("        \"Domain\": \"www.sufeinet.com\",");
                sb.Append("        \"SiteName\": \"苏飞论坛\"");
                sb.Append("    },");
                sb.Append("    {");
                sb.Append("        \"Stationmaster\": \"李彦宏\",");
                sb.Append("        \"Domain\": \"www.baidu.com\",");
                sb.Append("        \"SiteName\": \"百度\"");
                sb.Append("    },");
                sb.Append("    {");
                sb.Append("        \"Stationmaster\": \"马云\",");
                sb.Append("        \"Domain\": \"www.taobao.com\",");
                sb.Append("        \"SiteName\": \"淘宝\"");
                sb.Append("    }");
                sb.Append("]");
    
                List<SiteInfo> jsonlist = (List<SiteInfo>)HttpHelper.JsonToObject<List<SiteInfo>>(sb.ToString());

    执行效果如下

    QQ截图20140910150829.jpg

    有了这个方法,以后大家如果再需要解析Json,只需要定义好对象的类就Ok了。

    在线根据Json生成T类型的方法

    http://tool.sufeinet.com/Creater/JsonClassGenerator.aspx


  • TA的每日心情
    擦汗
    2016-12-28 19:48
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2014-9-12 13:43:24 | 显示全部楼层
  • TA的每日心情
    郁闷
    2016-10-28 17:10
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-10-17 10:02:11 | 显示全部楼层

    该用户从未签到

    发表于 2014-11-3 18:07:04 | 显示全部楼层

    该用户从未签到

    发表于 2015-2-1 15:30:20 | 显示全部楼层

    该用户从未签到

    发表于 2015-3-22 20:11:46 | 显示全部楼层

    该用户从未签到

    发表于 2015-3-22 20:22:42 | 显示全部楼层
    {
        "retcode": 0,
        "result": "1111"
    }
    这样的解析不了,必须要带引号才行。。。不可能要求别的网站带引号啊。
  • TA的每日心情
    开心
    昨天 09:37
  • 签到天数: 568 天

    [LV.9]以坛为家II

     楼主| 发表于 2015-3-23 08:35:23 | 显示全部楼层
    MeeSii 发表于 2015-3-22 20:22
    {
        "retcode": 0,
        "result": "1111"

    第一个问题:和多个层多个维没关系,只要你的对象对应关系正确就行。

    第二个问题,你说必须要带引号才行,那是因为你的Json里retcode是int类型,不加引号表示int类型。

    你肯定是在定义对象的时候直接将retcode定义成了字符串,而在解析时要找的是对应的int类型的retcode。这说明你的对象里没有要找的属性,当然是不能处理成功了。

    还有“不可能要求别的网站带引号啊”这个确实不可能。但是问题好像不在这里吧。你再分析一下。不要把基础的给丢了。



    该用户从未签到

    发表于 2015-4-2 13:25:10 | 显示全部楼层
    如果键值还是json类型的数据  这个类该如何定义呢?
    {"re":{"a":"a1","b":"b1","c":[{"d":"d1","e":"e1"}]}
    这种类型的如何定义?
  • TA的每日心情
    开心
    昨天 09:37
  • 签到天数: 568 天

    [LV.9]以坛为家II

     楼主| 发表于 2015-4-2 14:00:57 | 显示全部楼层
    [C#] 纯文本查看 复制代码
    {
    {
        "re": {
            "a": "a1",
            "b": "b1",
            "c": [
                {
                    "d": "d1",
                    "e": "e1"
                }
            ]
        }
    }


    [C#] 纯文本查看 复制代码
    publice class re
    {
       public string a;
       public string b;
       public c1 c;
    }
    
    publice class c1
    {
       public string d;
       public string e;
    }
    
    

    您需要登录后才可以回帖 登录 | 马上注册

    本版积分规则

    QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备17001017号-1 )

    GMT+8, 2018-8-17 05:16

    © 2017-2018

    快速回复 返回顶部 返回列表