话说作这个好久了,不过我比较磨洋工。因此托了好久,今天才真正跑通了整个流程。linux
一开始老师要我作的时候,我有点没明白意思,后来看了msdn后明白了很多。web
我要作的是用一句话来归纳就是,经过JSON来与后台的J2EE通信,操做数据。json
但就是这样一个简单的任务,我大概有认真作了一个礼拜吧。浏览器
下面说说主要的实现方法:服务器
首先咱们要提到webclient这个类,这是system自带的一个模仿web浏览器的类,用它来模仿POST访问(其实还能GET、PUT、DELETE)。app
具体的思路是:首先实体化一个webclient,打开端口下载或者上传JSON字符串,而后经过绑定实体类的方法来序列化或者反序列化JSON报文,最后作到咱们须要的数据操做。ui
具体代码以下:编码
一、首先咱们须要绑定实体类,以后用微软的自带类库来解析(也能够用JSON.NET这个开源的第三方类库,不过有些方法我还不懂)url
[DataContract] public class jsontext { [DataMember(Order = 0, IsRequired = true)] public int total { get; set; } [DataMember(Order = 1, IsRequired = true)] public weatherInfo[] rows { get; set; } } [DataContract] public class weatherInfo { [DataMember(Order = 0, IsRequired = true)] public int id { get; set; } [DataMember(Order = 1)] public double weatherType { get; set; } [DataMember(Order = 2)] public string weatherName { get; set; } [DataMember(Order = 3)] public double maxTemperature { get; set; } [DataMember(Order = 4)] public double minTemperature { get; set; } [DataMember(Order = 5)] public double rainFall { get; set; } [DataMember(Order = 6)] public double snowFall { get; set; } } [DataContract] public class weatherInsert { [DataMember(Order = 0, Name = "weatherInfo.iweatherType")] public double iweatherType { get; set; } [DataMember(Order = 1, Name = "weatherInfo.cweatherName")] public string cweatherName { get; set; } [DataMember(Order = 2, Name = "weatherInfo.imaxTemperature")] public double imaxTemperature { get; set; } [DataMember(Order = 3, Name = "weatherInfo.iminTemperature")] public double iminTemperature { get; set; } [DataMember(Order = 4, Name = "weatherInfo.irainFall")] public double irainFall { get; set; } [DataMember(Order = 5, Name = "weatherInfo.isnowFall")] public double isnowFall { get; set; } }
二、而后实例一个webclinet.net
WebClient webclient = new WebClient(); if (!webclient.IsBusy) { webclient.Encoding = System.Text.Encoding.UTF8;//防止乱码 json = webclient.DownloadString(address); }
三、序列化和反序列化,这里我就写在一块儿了
public static class iotmonSerial { //反序列化 public static T parse<T>(string jsonstring) { using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonstring))) { return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms); } } //序列化 public static string stringify(object jsonObject) { using (var ms = new MemoryStream()) { new DataContractJsonSerializer(jsonObject.GetType()).WriteObject(ms, jsonObject); return Encoding.UTF8.GetString(ms.ToArray()); } } }
四、经过调用前面的方法以及实体类,真正的解析了JSON,固然如今只是下载了数据,以后我会说如何上传。
var ppp = iotmonSerial.parse<jsontext>(json); foreach (var item in ppp.rows) { myTextBlock.Text += item.id + "\t" + item.weatherType + "\t" + item.weatherName + "\n"; }
五、而后咱们来讲说怎么上传数据吧~(太艰辛了)
Uri address = new Uri("http://localhost:8080/iotMon/WeatherInfo/listWeatherInfoPaged.action"); WebClient webClient = new WebClient(); webClient.UploadStringAsync(address, "POST", testString);
看上去很简单吧,可是这才是最坑人的地方,由于弄完以后,我发现死活传不上去。我比对了不少次JSP页面上发送的字符串,都是如出一辙的。
这是我苦恼了好久的问题,最后和老师调试了很久,终于找到了问题所在。
首先得定义发过去字符串的标头,详见http://msdn.microsoft.com/zh-...(最后有提到)
可是坑爹的MSDN也没有说解决方案,最后仍是感谢强大的百度和谷歌!
标头是以下(不一样的服务器可能不同,须要调整,第一个是保证编码是UTF-8的,咱们的项目UTF-8的):
webClient.Encoding = System.Text.Encoding.UTF8; webClient.Headers.Add(HttpRequestHeader.Accept, "json"); webClient.Headers.Add(HttpRequestHeader.ContentType,"application/x-www-form-urlencoded; charset=UTF-8"); webClient.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");
而后这么折腾以后我发现仍是不行,最后经过浏览器看上传过去的数据,发现了问题所在!
url发送过去的东西,会有一个url编码的转换,JSON报文里面最多的“{”和“[”都被转换成了“%7B”和“%5B”,因此咱们须要Microsoft.JScript.GlobalObject.encodeURIComponent来将已经作好的须要上传的报文转换格式。(须要说明的是,咱们的J2EE后台写的比较奇怪,因此上传和下载下来的格式是不同的,这一点我一开始没发现,走了很多弯路。)
到这里,就能够实现上传和下载了!真是不容易那(大変だ)!
下面是一些须要到的库文件:
System.Runtime.Serialization; 解析JSON报文
System.Runtime.Serialization.Json;
System.ServiceModel; 绑定实体类须要
System.ServiceModel.Web;
System.IO;
System.Xml;
System.Net; 解析JSON报文
System.Net.Http;
System.Net.Http.Formatting;
System.Web.Script.Serialization;
System.Json;
最后一点忘记补充了,上传上去的时候须要经过URL编码,这个视具体项目要不要转码。
最新问题,当服务器为linux系统时,须要加上webClient.Headers.Add(HttpRequestHeader.AcceptLanguage, "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");,否则没法上传。