http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 28933|回复: 17

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

[复制链接]
发表于 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




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 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;
}


发表于 2014-9-12 13:43:24 | 显示全部楼层
强烈支持楼主ing……
发表于 2014-10-17 10:02:11 | 显示全部楼层
强烈支持楼主ing……
发表于 2014-11-3 18:07:04 | 显示全部楼层
数组的反序列化不支持类型“System.String”。

发表于 2015-2-1 15:30:20 | 显示全部楼层
强烈支持楼主ing……
发表于 2015-3-22 20:11:46 | 显示全部楼层
多维数组怎么办。。
发表于 2015-3-22 20:22:42 | 显示全部楼层
{
    "retcode": 0,
    "result": "1111"
}
这样的解析不了,必须要带引号才行。。。不可能要求别的网站带引号啊。
 楼主| 发表于 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"}]}
这种类型的如何定义?
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-10-15 14:48

© 2014-2021

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