當初透過API接收到這串字串時很困擾,因為他不是JSON格式而是透過u001E u001D去分隔
u001E 代表分行 u001D 代表 兩個欄位去分開
這邊只是記錄一下,若下次再碰到此種狀況就可以利用split去分割
這是我call API 所接收到的一串字串,他是利用uniCode去編碼。
因為當初發現不是JSON格式時覺得很頭痛,但後來發現 \u001E 屬於分行 \u001D 屬於欄位分隔
可以看出這個回傳的欄位有兩個 一個叫做 EMP_NO 一個則是NAME
起初,我覺得這個就是JSON格式,但是怎麼又不太像。去詢問寫API的他說他不是JSON是字串。
先來看一下我們在c#中接收到實string data 到底接收到什麼東西
並且檢查了response.contentType 我發現他是 text/html ,而不是application/json
因此判定他其實有json parse 過
雖說他回傳出來的樣子不像是JSON格式,但我們仍需要deserialze 這個data 才可解析
再者,因為他是透過\u001E \u001D 來做區隔
所以我們先將\u001E 轉成陣列 再將每一個陣列值再分割並且注入 ArrayList裡面
完整代碼
public class A{
public ArrayList selLeaveEmp(string userID)
{
MySqlConnection conn = openMysqlConnection();
ArrayList leaveEmpArr = new ArrayList();
string empData = "";
string sysTime = System.DateTime.Now.AddDays(1).ToString("yyyyMMdd");
try
{
string url = "http://7/datasnap/rest/TServerMethods1/Call_Server/PQR:";
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{
using (StreamReader myStreamReader = new StreamReader(wr.GetResponseStream()))
{
string data = myStreamReader.ReadToEnd();
LeaveEmp rt = JsonConvert.DeserializeObject<LeaveEmp>(data);
empData = rt.result[0];
string[] Split = empData.Split('\u001E');
for (int i = 0; i < Split.Length; i++)
{
string[] a = Split[i].Split('\u001d');
for(int j = 0; j < a.Length; j++)
{
leaveEmpArr.Add(a[j]);
}
}
myStreamReader.Close();
}
}
}
catch (Exception ex)
{
Console.Write(ex.ToString());
using (StreamWriter sw = File.AppendText(path2))
{
sw.WriteLine("selLeaveEmp ERROR");
}
}
finally
{
conn.Close();
}
return leaveEmpArr;
}
}
public class LeaveEmp
{
public List<string> result { get; set; }
}