我想解析网页里面的数组,有什么优雅的办法或者第三方组件也行?

泡泡龙 2016-10-20 12:48:27
和讯网的数据提前预处理改成[[***],[***]]格式之后,
再用new JavaScriptSerializer().Deserialize<List<object>>(arrayText)来得到List<object>

感觉这样不太优雅,有没有什么代码或者组件能直接解析下面的数据,而不用提前对字符串做处理呢?

dataArr = [
['603816','N顾家',35.51,44.00,24.66,29.59,35.51,29.59,606.04,2145536,0.07,24.01,0.00],
['603887','城地股份',25.58,10.02,23.25,25.58,25.58,25.58,182.11,465837,0.07,0.00,0.00],
['603777','来伊份',20.33,10.01,18.48,20.33,20.33,20.33,128.89,262033,0.02,0.00,0.00],
['603738','泰晶科技',45.28,10.01,41.16,45.28,45.28,45.28,190.86,864214,0.11,0.00,0.00],
['603313','恒康家居',24.41,10.00,22.19,24.41,24.41,24.41,158.71,387411,0.03,0.00,0.00],
['603189','网达软件',43.67,10.00,39.70,43.67,43.67,43.67,6457.52,28199990,1.17,0.00,0.00],
['600500','中化国际',10.57,9.99,9.61,9.61,10.57,9.52,576628.41,596498090,3.35,10.93,4.81],
['603421','鼎信通讯',26.87,9.99,24.43,26.87,26.87,26.87,104,279448,0.02,0.00,0.00]];StockListPage.GetData(dataArr,134,"2016-10-16 09:25:10");

本人对js不太熟,谢谢
...全文
384 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡泡龙 2016-10-24
  • 打赏
  • 举报
回复
测试了一下,10楼的速度和我在4楼的代码效率没有本质的区别。大概也就这样了
stherix 2016-10-23
  • 打赏
  • 举报
回复
引用 6 楼 liucqa 的回复:
[quote=引用 5 楼 xuzuning 的回复:] dataArr = [ ['603816','N顾家',35.51,44.00,24.66,29.59,35.51,29.59,606.04,2145536,0.07,24.01,0.00], ......00]];StockListPage.GetData(dataArr,134,"2016-10-16 09:25:10"); 你得到的是 js 代码,用 C# 处理的话就截取套红的一段,用 json.net 解码就可以了 注意 GetData 方法的参数 "2016-10-16 09:25:10",应该是数据的标定时间
像这种纯数组,用newtonsoft和fastjson应该如何解析呢,有没有代码例子,网上好像都是带对象的,需要建立一个类才能做解析,但这样如果网站换数据可能会出问题。有没有用newtonsoft和fastjson直接解析然后按照索引就能取值的例子呢,谢谢![/quote] 并不一定需要建立一个类 直接new JavaScriptSerializer().DeserializeObject(xxx)就可以 返回的是一个object 其中对象 json数组 那么是数组 json对象 那么是Dictionary<string,object> json值 那么是int/string之类的 反正ToString都能取出来
我叫小菜菜 2016-10-23
  • 打赏
  • 举报
回复
没看懂什么意思。 如果是json格式,直接用json组件处理即可。 截取数据,可以用正则或者xpath
泡泡龙 2016-10-23
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
dataArr = [ ['603816','N顾家',35.51,44.00,24.66,29.59,35.51,29.59,606.04,2145536,0.07,24.01,0.00], ......00]];StockListPage.GetData(dataArr,134,"2016-10-16 09:25:10"); 你得到的是 js 代码,用 C# 处理的话就截取套红的一段,用 json.net 解码就可以了 注意 GetData 方法的参数 "2016-10-16 09:25:10",应该是数据的标定时间
像这种纯数组,用newtonsoft和fastjson应该如何解析呢,有没有代码例子,网上好像都是带对象的,需要建立一个类才能做解析,但这样如果网站换数据可能会出问题。有没有用newtonsoft和fastjson直接解析然后按照索引就能取值的例子呢,谢谢!
泡泡龙 2016-10-23
  • 打赏
  • 举报
回复
引用 10 楼 xuzuning 的回复:
谢谢,等我明天测试一下json.net的性能,对比一下
xuzuning 2016-10-23
  • 打赏
  • 举报
回复
dataArr = [ ['603816','N顾家',35.51,44.00,24.66,29.59,35.51,29.59,606.04,2145536,0.07,24.01,0.00], ......00]];StockListPage.GetData(dataArr,134,"2016-10-16 09:25:10"); 你得到的是 js 代码,用 C# 处理的话就截取套红的一段,用 json.net 解码就可以了 注意 GetData 方法的参数 "2016-10-16 09:25:10",应该是数据的标定时间
泡泡龙 2016-10-23
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
谁知道原始数据是什么样的
一楼就是原始数据,里面带着回车换行符,所以看着像是排好版的。这个数据是和讯网的实时行情。 目前我的办法是把多余部分去掉,剩下二维数组,再解析成list<object>
string Text = responseText.Replace("\r\n", "");
            int idx1 = Text.IndexOf('[');
            int idx2 = Text.IndexOf(';');
            Text = Text.Substring(idx1, idx2 - idx1);

            if (Text.Length > 0)
            {
                List<object> stocksInfo = new JavaScriptSerializer().Deserialize<List<object>>(Text);
                return stocksInfo;
            }
            else
            {
                return null;
            }
然后遍历这个list,用(stockinfo as Object[]).GetValue(0).ToString();取出每一个数据。 感觉这样代码有点笨拙,有没有什么更好的办法,谢谢
xuzuning 2016-10-23
  • 打赏
  • 举报
回复
        static void Main(string[] args)
{
var s = @"
dataArr = [
['603816','N顾家',35.51,44.00,24.66,29.59,35.51,29.59,606.04,2145536,0.07,24.01,0.00],
['603887','城地股份',25.58,10.02,23.25,25.58,25.58,25.58,182.11,465837,0.07,0.00,0.00],
['603777','来伊份',20.33,10.01,18.48,20.33,20.33,20.33,128.89,262033,0.02,0.00,0.00],
['603738','泰晶科技',45.28,10.01,41.16,45.28,45.28,45.28,190.86,864214,0.11,0.00,0.00],
['603313','恒康家居',24.41,10.00,22.19,24.41,24.41,24.41,158.71,387411,0.03,0.00,0.00],
['603189','网达软件',43.67,10.00,39.70,43.67,43.67,43.67,6457.52,28199990,1.17,0.00,0.00],
['600500','中化国际',10.57,9.99,9.61,9.61,10.57,9.52,576628.41,596498090,3.35,10.93,4.81],
['603421','鼎信通讯',26.87,9.99,24.43,26.87,26.87,26.87,104,279448,0.02,0.00,0.00]];StockListPage.GetData(dataArr,134,""2016-10-16 09:25:10"");";
var m = Regex.Match(s, @"\[.+\]", RegexOptions.Singleline);
var a = JArray.Parse(m.Value);
foreach (var r in a)
{
Console.WriteLine(string.Join(" | ", r));
}
}
泡泡龙 2016-10-23
  • 打赏
  • 举报
回复
引用 8 楼 stherix 的回复:
[quote=引用 6 楼 liucqa 的回复:] [quote=引用 5 楼 xuzuning 的回复:] dataArr = [ ['603816','N顾家',35.51,44.00,24.66,29.59,35.51,29.59,606.04,2145536,0.07,24.01,0.00], ......00]];StockListPage.GetData(dataArr,134,"2016-10-16 09:25:10"); 你得到的是 js 代码,用 C# 处理的话就截取套红的一段,用 json.net 解码就可以了 注意 GetData 方法的参数 "2016-10-16 09:25:10",应该是数据的标定时间
像这种纯数组,用newtonsoft和fastjson应该如何解析呢,有没有代码例子,网上好像都是带对象的,需要建立一个类才能做解析,但这样如果网站换数据可能会出问题。有没有用newtonsoft和fastjson直接解析然后按照索引就能取值的例子呢,谢谢![/quote] 并不一定需要建立一个类 直接new JavaScriptSerializer().DeserializeObject(xxx)就可以 返回的是一个object 其中对象 json数组 那么是数组 json对象 那么是Dictionary<string,object> json值 那么是int/string之类的 反正ToString都能取出来[/quote] 是呀,我就是这么干的,但是我觉得效率不太好。 用其他组件是不是会好些呢?有没有类似的例子。我用fastjson没发现怎么反序列化array。
cuyi0 2016-10-22
  • 打赏
  • 举报
回复
用正则吧、先匹配出每一个 [ ] 然后再用正则匹配每一个 [ ]内的数据。
xuzuning 2016-10-21
  • 打赏
  • 举报
回复
谁知道原始数据是什么样的
泡泡龙 2016-10-21
  • 打赏
  • 举报
回复
莫非只能预处理成[[***],[***]]格式吗

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧