我尝试反序列化JSON,如下所示(像93817和935812这样的数字是从服务器动态生成的。不能硬编码。):
{ "status":"1",
"list":{
"93817":{ "item_id":"93817",
"url":"http://url.com",
"title":"Page Title",
"time_updated":"1245626956",
"time_added":"1245626956",
"tags":"comma,seperated,list",
"state":"0"
},
"935812":{ "item_id":"935812",
"url":"http://google.com",
"title":"Google",
"time_updated":"1245626956",
"time_added":"1245626956",
"tags":"comma,seperated,list",
"state":"1"
} }}
以下是反序列化的代码:
responseGetList = e.Result.ToString(); //responseGetList is the JSON string
MemoryStream ms = new MemoryStream( Encoding.Unicode.GetBytes(responseGetList));
DataContractJsonSerializer serializer =
new DataContractJsonSerializer( typeof(List<ResponseItem>) );
ResponseItem li = (ResponseItem)serializer.ReadObject(ms);
以下是ResponseItem类:
namespace whatever
{
[DataContract]
public class ResponseItem
{
[DataMember(Name = "status")]
string status;
public string Status
{
get { return status; }
set { status = value; }
}
[DataMember(Name = "list")]
List<ListItem> list;
private List<ListItem> List
{
get { return list; }
set { list = value; }
}
}
public class ListItem
{
[DataMember]
List<Article> listArticle;
public List<Article> ListArticle
{
get { return listArticle; }
set { listArticle = value; }
}
}
}
public class Article
{
[DataMember(Name = "item_id")]
string item_id;
public string Item_id
{
get { return item_id; }
set { item_id = value; }
}
[DataMember(Name = "url")]
string url;
public string Url
{
get { return url; }
set { url = value; }
}
[DataMember(Name = "title")]
string title;
public string Title
{
get { return title; }
set { title = value; }
}
[DataMember(Name = "time_updated")]
string time_updated;
public string Time_updated
{
get { return time_updated; }
set { time_updated = value; }
}
[DataMember(Name = "time_added")]
string time_added;
public string Time_added
{
get { return time_added; }
set { time_added = value; }
}
[DataMember(Name = "tags")]
string tags;
public string Tags
{
get { return tags; }
set { tags = value; }
}
[DataMember(Name = "state")]
string state;
public string State
{
get { return state; }
set { state = value; }
}
}
我在1 ataContractJsonSerializer serializer =
new DataContractJsonSerializer( typeof(List<ResponseItem>) );
上得到InvalidCastException,我认为这是一个JSON-Object映射问题。任何人都可以帮助我吗?
答案 0 :(得分:2)
尝试使用NewtonSoft的LINQ to Json,这是一种更清晰的方法来取消/序列化json字符串
ClassName class= new ClassName();
objectname = JsonConvert.DeserializeObject<ClassName>(responseGetList);
使用Json2C#创建您需要能够直接反序列化为对象的ClassName。
您可以使用object。 __ 来调用任何结果:示例包含您的代码:
object.list。(93817(你必须使用JsonProperty强制转换它,因为c#不允许只带数字的方法)。)item_id = 93817
cleaner:object.list.thenameyougavethemethod.item_id
祝你好运,如果你有更多问题,只需添加评论
编辑:我解析了json字符串,并将JsonProperties添加到您的特定Json字符串中; 只需下载NewtonSoft .dll&amp;不要忘记添加对项目的引用......
public class id93817
{
public string item_id { get; set; }
public string url { get; set; }
public string title { get; set; }
public string time_updated { get; set; }
public string time_added { get; set; }
public string tags { get; set; }
public string state { get; set; }
}
public class id935812
{
public string item_id { get; set; }
public string url { get; set; }
public string title { get; set; }
public string time_updated { get; set; }
public string time_added { get; set; }
public string tags { get; set; }
public string state { get; set; }
}
public class List
{
[JsonProperty("93817")]
public id93817 { get; set; }
[JsonProperty("935812")]
public id935812 { get; set; }
}
public class RootObject
{
public string status { get; set; }
public List list { get; set; }
}
答案 1 :(得分:0)
尝试切换到Json.NET以反序列化对象。它不易出错且易碎(是的,它是开源的,可在手机上使用)&gt;
答案 2 :(得分:0)
列表中的第一项不正确。您的JSON显示“93817”和“935812”,但这些不是您商品的属性。 JSON的第一部分必须是属性名称。您正在为“列表”执行此操作,因为它对应于List
的{{1}}属性。将这些数字更改为“listArticle”。我也是第二个Shawn Wildermuth对JSON.Net的建议。
在服务器上生成的JSON应该以与反序列化相同的方式序列化(即:使用相同的框架(de)序列化)。如果您手动生成JSON,请不要。您将遇到比您需要或想要的更多问题。
如果序列化对象,则应具有以下内容:
ResponseItem
答案 3 :(得分:0)
通过阅读RIL#(http://rilsharp.codeplex.com/)的源代码解决了问题。 问题主要是映射问题。使用字典是关键解决方案:
[DataContract]
public class ResponseItem
{
[DataMember(Name = "status")]
public ListStatus Status { get; set; }
[DataMember(Name = "since")]
public double Since { get; set; }
[DataMember(Name = "list")]
public Dictionary<string, RilListItem> items { get; set; }
public DateTime SinceDate
{
get
{
return UnixTime.ToDateTime(Since);
}
}
然后使用Json.net反序列化JSON:
ResponseItem ri = new ResponseItem();
ri = JsonConvert.DeserializeObject<ResponseItem>(responseGetList);