Newtonsoft.Json.dll 的下载就不多说了,网上很多
1.打包
可以根据自己的消息需求,建立一个类存在消息类容
如:public class Message
{
public string msgtype;
public string msgreq;
public string dpto;
}
打包的方法为:
Message msg = new Message();
msg.msgtype = "login";
msg.msgreq = "1";
msg.dpto = "user";
string strJson = GetMessage(msg);
public static string GetMessage(Message msg)
{
string result = JsonConvert.SerializeObject(msg, Formatting.Indented, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore });
//SerializeObject 第一个参数是放的Message的对象,第一个参数是指定是否格式化,第三个是格式化的方式(这里选择的是忽略值为空的属性)
return result;
}
解包的方法:
public static string GetSValue(string message, string key)
{
JObject jobject = (JObject)JsonConvert.DeserializeObject(message);
string resultStr = "";
if (key.IndexOf(".") > -1)
{
string[] sArray = key.Split('.');
foreach (string i in sArray)
{
if (i == sArray[sArray.Count() - 1])
{
resultStr = jobject[i].ToString();
}
else
{
jobject = (JObject)jobject[i];
}
}
}
else
{
resultStr = jobject[key].ToString();
}
return resultStr;
}
public static JObject GetOValue(string message, string key)
{
JObject jobject = (JObject)JsonConvert.DeserializeObject(message);
JObject jo = new JObject();
if (key.IndexOf(".") > -1)
{
string[] sArray = key.Split('.');
foreach (string i in sArray)
{
if (i == sArray[sArray.Count() - 1])
{
jo = (JObject)jobject[i];
}
else
{
jobject = (JObject)jobject[i];
}
}
}
else
{
jo = (JObject)jobject[key];
}
return jo;
}
public static JArray GetAValue(string message, string key)
{
JObject jobject = (JObject)JsonConvert.DeserializeObject(message);
JArray jarray = new JArray();
if (key.IndexOf(".") > -1)
{
string[] sArray = key.Split('.');
foreach (string i in sArray)
{
if (i == sArray[sArray.Count() - 1])
{
jarray = (JArray)jobject[i];
}
else
{
jobject = (JObject)jobject[i];
}
}
}
else
{
jarray = (JArray)jobject[key];
}
return jarray;
}
这里提供了三种不同返回的解包方式,可根据自己需要调用不用的函数
以下面的Json 为例:
{
"msgtype": "login",
"msgseq": "111",
"msgdata": {
"usrauth": ["Event", "Doors", "TA"],
"token": "1804289383",
"servlist": [["1", "1", "server1", "192.168.1.252", "30000", "1234567890"], ["2", "2", "server2", "192.168.1.253", "30000", "1234567891"]]
},
"msgresult": "ok"
}
如果现在要获取msgseq 的value
rec 为接收的Json字符串
Console.WriteLine(GetSValue(rec,"msgseq"))
获取msgdata下面的msgresult
Console.WriteLine(GetSValue(rec,"msgdata.msgseq"));
获取msgdata下面的usrauth 数组
JArray jarray = GetAValue(rec, "msgdata.usrauth");
for (int i = 0; i < jarray.Count; i++)
{
Console.WriteLine(jarray[i].ToString());
}
List<Server> ser = new List<Server>();
JArray jarray = OperatorMsg.GetAValue(rec, "msgdata.servlist");
for (int i = 0; i < jarray.Count; i++)
{
JArray ja = (JArray)jarray[i];
Server serv = new Server();
serv.id = int.Parse(ja[1].ToString());
serv.name = ja[2].ToString();
serv.ip = ja[3].ToString();
serv.port = int.Parse(ja[4].ToString());
serv.token = int.Parse(ja[5].ToString());
ser.Add(serv);
}