【问题】
折腾:
【已解决】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:
然后也找不到其他那些,比如JArray,JObject。
2.后来从:
【已解决】Bad JSON escape sequence: \x. Path ‘results[0].html’, line 8, position 12.
中注意到,打印输出的时候,已经可以看到有:
StartArray,StartObject等对象了。
然后继续找,终于找到类似于JArray,JObject的:
JsonToken.StartArray
但是,却没有对应的Parse等方法:
所以放弃此法。
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。
后来参考:
去添加3.5和4.0的.Net,结果都找不到System.Web.Script,所以更别指望System.Web.Script.Serialization了。
然后是参考官网:
的解释:
JavaScriptSerializer Class
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等内容,不是一般的繁琐啊。。。