最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【未解决】C#中从Json.Net解析后的Json中获得某个列表类型的变量

JSON crifan 4841浏览 0评论

【问题】

折腾:

【已解决】C#中解析Json字符串

【已解决】Bad JSON escape sequence: \x. Path ‘results[0].html’, line 8, position 12.

的过程中,已经可以把如下json:

{
'query': 'weight loss',
'frequency': '3',
'has_recent_results': 1,
'results': [
{
'input': 'NEWS',
'html': 'xxxxx'
}
,
{
'input': 'WEB',
'html': 'yyyyyy'
}
]
}

通过Json.Net去解析出来了。

接下来是想要获得其中的results这个列表类型的变量。

【解决过程】

1.参考:

Unable to parse json with complex object (JSON.Net)

去试着使用JArray,但是发现此处没有这个类型的变量,只有JsonArrayAttribute:

only has jsonArrayAttribute

然后也找不到其他那些,比如JArray,JObject。

2.后来从:

【已解决】Bad JSON escape sequence: \x. Path ‘results[0].html’, line 8, position 12.

中注意到,打印输出的时候,已经可以看到有:

StartArray,StartObject等对象了。

然后继续找,终于找到类似于JArray,JObject的:

JsonToken.StartArray

但是,却没有对应的Parse等方法:

jsontoken startarray no parse method

所以放弃此法。

3.参考:

Parsing through JSON in JSON.NET with unknown property names

去试试:

            dynamic parsedObject = JsonConvert.DeserializeObject(jsonText);
            dynamic listValue = parsedObject["results"];

结果却是无法编译:

错误    1    找不到编译动态表达式所需的一种或多种类型。是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用?   

 

4.暂时放弃用Json.Net去折腾List变量。

参考:

convert json to c# list of objects

去试试:

            string filteredJsonText = jsonText.Replace("'", "\"");
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            MovieCollection collection = serializer.Deserialize<MovieCollection>(filteredJsonText);

但是,却找不到JavaScriptSerializer。

后来参考:

C#处理Json文件

去添加3.5和4.0的.Net,结果都找不到System.Web.Script,所以更别指望System.Web.Script.Serialization了。

然后是参考官网:

JavaScriptSerializer Class

的解释:

JavaScriptSerializer Class


System.Object

System.Web.Script.Serialization.JavaScriptSerializer

Namespace: System.Web.Script.Serialization

Assembly: System.Web.Extensions (in System.Web.Extensions.dll)

再去添加System.Web.Extensions,然后就可以找到JavaScriptSerializer了。

5.然后就是针对于:

{
'query': 'weight loss',
'frequency': '3',
'has_recent_results': 1,
'results': [
{
'input': 'NEWS',
'html': 'xxxxx'
}
,
{
'input': 'WEB',
'html': 'yyyyyy'
}
]
}

的json字符串,用如下定义和代码:

class result
{
	public string input { get; set; }
	public string html { get; set; }
}

class resultCollection
{
	public IEnumerable<result> results { get; set; }
}

class searchResultJson
{
	public string query;
	public string frequency;
	public int has_recent_results;
	public resultCollection results;
}

string filteredJsonText = jsonText.Replace("'", "\"");
JavaScriptSerializer serializer = new JavaScriptSerializer();
searchResultJson collection = serializer.Deserialize<searchResultJson>(filteredJsonText);

去试试,结果出现:

无法识别的转义序列。 (119)

然后去看了看119的位置,果然是预料的\x0A的位置。

看来,此处也是无法正常识别此十六进制的值啊。

看来,只能是手动处理\xXX之后,然后再用json处理才可以。

 

【总结】

算了,等有空再去写,如何手动的,用正则或string的replace,去把

\x0A

之类的,转换为对应的字符,

然后再去调用JavaScriptSerializer去解析json的吧。

目前看来,C#中对于json的解析,尤其是包含了html等内容,不是一般的繁琐啊。。。

转载请注明:在路上 » 【未解决】C#中从Json.Net解析后的Json中获得某个列表类型的变量

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.172 seconds, using 22.17MB memory