c#如何处理Json字符串

JerryZhou_ 2012-08-06 03:10:20
本人新手 刚刚接触c# 现在是要实现c#调用java websevice返回的list对象
我通过json传递、现在的问题是我如何在c#这边接收呢?网上找了很多答案 但是最终还是没有实现、
这个是返回的json字符串:

{
"list": [
{
"account": "As",
"flag": "",
"id": "0f86ebbe-df69-11e1-b891-41d04d127205",
"password": "123456",
"regDate": ""
},
{
"account": "111111",
"flag": "",
"id": "36988ff4-dc46-11e1-a738-fc2be3f21384",
"password": "111111",
"regDate": ""
},
{
"account": "111111",
"flag": "251637313@qq.com",
"id": "402881e136103b560136103bcdf20001",
"password": "0B4E7A0E5FE84AD35FB5F95B9CEEAC79",
"regDate": "1"
},
{
"account": "222222",
"flag": "251637313@qq.com",
"id": "8a809762359e71aa01359e74296f0001",
"password": "E3CEB5881A0A1FDAAD01296D7554868D",
"regDate": "0"
},
{
"account": "777",
"flag": "777",
"id": "8a80d8ab389e119001389e11e1e50001",
"password": "777",
"regDate": "1"
}
]
}


网上找的一个实现方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;
using System.IO;

namespace TestWebServicePro
{
class JsonHelp
{
/// <summary>
/// 将对象转换为 JSON 字符串。
/// </summary>
/// <param name="obj">要序列化的对象。</param>
/// <returns>序列化的 JSON 字符串。</returns>
public static string JsonSerialize(object obj)
{
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
return jsSerializer.Serialize(obj);
}
/// <summary>
/// 将指定的 JSON 字符串转换为 T 类型的对象。
/// </summary>
/// <typeparam name="T">所生成对象的类型。</typeparam>
/// <param name="input">要进行反序列化的 JSON 字符串。</param>
/// <param name="def">反序列化失败时返回的默认值。</param>
/// <returns>反序列化的对象。</returns>
public static T JosnDeserialize<T>(string input, T def)
{
if (string.IsNullOrEmpty(input))
return def;
try
{
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
return jsSerializer.Deserialize<T>(input);
}
catch (InvalidOperationException)
{
return def;
}
}
}
}



c#里面定义的实体类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestWebServicePro
{
[Serializable()]
class Test
{
public string account { get; set; }
public string flag { get; set; }
public string id { get; set; }
public string password { get; set; }
public string regDate { get; set; }

public override string ToString()
{
return string.Format("account={0}, flag={1}, id={2},password={3},regDate={4}", account, flag, id, password, regDate);
}
}
}


调用:

private void button1_Click(object sender, EventArgs e)
{
WebReference.TestWebService ts = new WebReference.TestWebService();
string strJson = ts.getUserList();//这里的字符串就是通过java webservice返回的,已经贴在上面了

Test item = JsonHelp.JosnDeserialize<Test>(strJson, null);


if (item != null)
{
Console.WriteLine(item.ToString());
}
}

这里显示的结果就一直为:account=, flag=, id=,password=,regDate=
我只需要实现 上面输出的部分有值就ok了 谢谢!
...全文
2005 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
JerryZhou_ 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

你给那个字符串前面加个[] 在把它转化为json对象 那么就可以已数组的方式直接用拉.
[/Quote]
这个....
天下如山 2012-08-08
  • 打赏
  • 举报
回复
你给那个字符串前面加个[] 在把它转化为json对象 那么就可以已数组的方式直接用拉.
JerryZhou_ 2012-08-07
  • 打赏
  • 举报
回复
额 问题昨天解决了 其实大家推荐的方法应该都是可行的
最后还是用了.net自带的方法实现的 主要还是我传过来的
JSON数据的问题 转化一下就能实现了、、
public static class JsonHelper
{
/// <summary>
/// Json序列化,用于发送到客户端
/// </summary>
public static string ToJsJson(this object item)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType());

using (MemoryStream ms = new MemoryStream())
{

serializer.WriteObject(ms, item);

StringBuilder sb = new StringBuilder();

sb.Append(Encoding.UTF8.GetString(ms.ToArray()));

return sb.ToString();

}

}

/// <summary>
/// Json反序列化,用于接收客户端Json后生成对应的对象
/// </summary>
public static T FromJsonTo<T>(this string jsonString)
{

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));

MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));

T jsonObject = (T)ser.ReadObject(ms);

ms.Close();

return jsonObject;

}
}

顺便再请教个问题 哈 关于正则的问题:
{"account":"Test","flag":"0","id":"7a2689a6-e02b-11e1-b030-2003af66ee78","password":"111111","regDate":"2012-02-12"},{"account":"JerryZhou","flag":"0","id":"bfb50017-dc76-11e1-a738-fc2be3f21384","password":"888888","regDate":"2012-07-20"}

如何拆分成 :
{"account":"Test","flag":"0","id":"7a2689a6-e02b-11e1-b030-2003af66ee78","password":"111111","regDate":"2012-02-12"}

{"account":"JerryZhou","flag":"0","id":"bfb50017-dc76-11e1-a738-fc2be3f21384","password":"888888","regDate":"2012-07-20"}
呢?

也就是说把数据分组一下、要正则表达式实现、字符串截取的方式已经实现...
JerryZhou_ 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

看看这个:
http://archive.cnblogs.com/a/2618996/

如果使用的是VS2010,则要求当前的工程的Target Framework要改成.Net Framework 4,不能使用Client Profile
[/Quote]
嗯 这个看了 按照这个实现过 但还是不行 出不来效果
APM60- 2012-08-06
  • 打赏
  • 举报
回复
如果json的格式是固定的,可以参考下面的:

try
{
WebClient WebClientWeather = new WebClient();
Stream streamWeather = WebClientWeather.OpenRead("http://m.weather.com.cn/data/101120301.html");
StreamReader StreamReaderWeather = new StreamReader(streamWeather);
string strWeather = StreamReaderWeather.ReadToEnd();
System.Web.Script.Serialization.JavaScriptSerializer json = new System.Web.Script.Serialization.JavaScriptSerializer();
Dictionary<string, object> weatherData = (Dictionary<string, object>)json.DeserializeObject(strWeather);
Dictionary<string, object> weatherInfo = (Dictionary<string, object>)weatherData["weatherinfo"];
string strTemp = weatherInfo["temp1"].ToString();
string weatherText = weatherInfo["weather1"].ToString();

须添加引用System.Web.Extensions(或System.Web,具体哪一个记不清了)
我在vs2008 .net3.5下用的这个。
缺点:json的格式必须是固定的。
ohkuy 2012-08-06
  • 打赏
  • 举报
回复
看看这个:
http://archive.cnblogs.com/a/2618996/

如果使用的是VS2010,则要求当前的工程的Target Framework要改成.Net Framework 4,不能使用Client Profile
mjp1234airen4385 2012-08-06
  • 打赏
  • 举报
回复
以下是DataSet转成json的代码,就是这么简单。
你在转回去就好了。
/// <summary>
/// 反回JSON数据到前台
/// </summary>
/// <param name="dt">数据表</param>
/// <returns>JSON字符串</returns>
private static string DataTableToJson(DataTable dt)
{
StringBuilder JsonString = new StringBuilder();
if (dt != null && dt.Rows.Count > 0)
{
JsonString.Append("\"" + dt.TableName + "\":[");
for (int i = 0; i < dt.Rows.Count; i++)
{
JsonString.Append("{");
for (int j = 0; j < dt.Columns.Count; j++)
{
if (j < dt.Columns.Count - 1)
{
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + dt.Rows[i][j].ToString() + "\",");
}
else if (j == dt.Columns.Count - 1)
{
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + dt.Rows[i][j].ToString() + "\"");
}
}
if (i == dt.Rows.Count - 1)
{
JsonString.Append("}");
}
else
{
JsonString.Append("},");
}
}
JsonString.Append("]");
return JsonString.ToString();
}
else
{
return null;
}
}
mjp1234airen4385 2012-08-06
  • 打赏
  • 举报
回复
自己写吧。
天下如山 2012-08-06
  • 打赏
  • 举报
回复
已发送DEMO到你QQ邮箱 自己看看 研究下吧 很容易的.
JerryZhou_ 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

或者使用微软自带的json解析 或者使用Newtonsoft.Json.dll
还有你说的报错 你确定你using Newtonsoft.Json.dll了吗?
[/Quote]
可否留Q咨询下你、?或者麻烦你加下我的 251637313 谢谢!
天下如山 2012-08-06
  • 打赏
  • 举报
回复
或者使用微软自带的json解析 或者使用Newtonsoft.Json.dll
还有你说的报错 你确定你using Newtonsoft.Json.dll了吗?
JerryZhou_ 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

如果你是。Net 3.5以上,直接支持Json了。。。

如果是。net 2,就像楼上说的,下载一个三方Json库:Newtonsoft.Json.dll
[/Quote]

我用的是.Net4了 VS2010
JerryZhou_ 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

使用:Newtonsoft.Json 自己去下载 然后引用
比如:
C# code

//Main:
string output="{\"status\":100,\"info\":\"ok\",\"data\":{\"c_id\":\"12\",\"c_key\":\"a8ada1d9\",\"c_name\":\"\u5357\u4eac\u70fd\u706b\u79d1\u6280……
[/Quote]
你说的这个控件我已经添加了的、
现在按照你的方法 报错 说是 JavaScriptConvert 上下文中不存在的
  • 打赏
  • 举报
回复
//[Serializable()] 改成
[System.Runtime.Serialization.DataContractAttribute]
class Test
{
[System.Runtime.Serialization.DataMemberAttribute] //每个属性上面都加上
public string account { get; set; }



  • 打赏
  • 举报
回复
引用服务时,在高级(或者服务配置)对话框中,选定你要使用的集合类型(List<T> Array, LinkedList...)
  • 打赏
  • 举报
回复
java websevice
直接在工程上右键,添加服务引用不就OK了,干嘛还要自己去解析?
gul_gui 2012-08-06
  • 打赏
  • 举报
回复
最笨的方法 自己拆字符串 写几个公用的方法
稻庄 2012-08-06
  • 打赏
  • 举报
回复
不了解。
坐等高手前来解答。
isjoe 2012-08-06
  • 打赏
  • 举报
回复
如果你是。Net 3.5以上,直接支持Json了。。。

如果是。net 2,就像楼上说的,下载一个三方Json库:Newtonsoft.Json.dll
天下如山 2012-08-06
  • 打赏
  • 举报
回复
使用:Newtonsoft.Json 自己去下载 然后引用
比如:

//Main:
string output="{\"status\":100,\"info\":\"ok\",\"data\":{\"c_id\":\"12\",\"c_key\":\"a8ada1d9\",\"c_name\":\"\u5357\u4eac\u70fd\u706b\u79d1\u6280\u6709\u9650\u516c\u53f8\",\"b_key\":\"EDUSHI_11544\",\"n_key\":\"qe123Waq\",\"c_card\":\"<span></span>\",\"contact_person\":\"\u5f20\u4e09\",\"contact_phone\":\"800-8800787\",\"virtual_name\":\"fenghuo-oa\",\"virtual_addr\":\"172.16.50.207\",\"status\":100}}";
Product deserializedProduct = (Product)JavaScriptConvert.DeserializeObject(output, typeof(Product));
Console.WriteLine(deserializedProduct.status);
Console.WriteLine(deserializedProduct.data.c_card);

//Model:
public class Product
{
private int Status;
public int status
{
get { return Status; }
set { Status = value; }
}
private string Info;
public string info
{
get { return Info; }
set { Info = value; }
}
private StringData Data;
public StringData data
{
get { return Data; }
set { Data = value; }
}
}
//StringData类型就省略拉 太多属性

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧