我在 WCF 中编写了一些类(数据契约和服务契约),并且尝试在 JSON 中进行序列化和反序列化。如果我需要以下 JSON 结构,我将如何创建 DataContract(s):
{
"response": {
"locations": {
"location": [
{
"id": "12",
"name": "Hello",
"statusid": "78"
},
{
"id": "5",
"name": "Ann",
"statusid": "8"
}
]
},
"error": "404 error"
}
}
上面的结构非常简单,在位置下可以有几个位置详细信息,如上所述。所以我需要获取一个数组/列表来“位置”数据成员,如下所述。目前我只有以下数据契约(Contract):
[DataContract]
public class Response
{
[DataMember]
public string locations { get; set; }
[DataMember]
public string error{ get; set; }
}
请告诉我如何解决这个问题?
最佳答案
您正在寻找的完整对象的结构应如下:
[DataContract(Name="response")]
public class Response
{
[DataMember(Name = "locations")]
public IEnumerable<Location> Locations { get; set; }
[DataMember(Name = "error")]
public string Error { get; set; }
}
[DataContract(Name = "location")]
public class Location
{
[DataMember(Name = "id")]
public string Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "statusid")]
public string StatusId { get; set; }
}
您需要设置对象层次结构,如 {
和 }
所示,以及 IEnumerable/数组属性,如 [ 所示
和 ]
来自您所需的 JSON 输出。
该网站可能会令人困惑,因为没有简单的示例,但请查看 Introducing JSON对语法有基本的了解。我遇到的另一个很好的网站是JSON and XML Serialization in ASP.NET Web API,只有一些简单的例子。 .
感谢 vittore 的一些指导,我注意到要构建与 JSON 输出的精确匹配,您将需要以下对象:
[DataContract]
public class ResponseParent
{
[DataMember(Name = "response")]
public Response ResponseInstance { get; set; }
}
[DataContract]
public class Response
{
[DataMember(Name = "locations")]
public LocationCollectionIntermediate Locations { get; set; }
[DataMember(Name = "error")]
public string Error { get; set; }
}
[DataContract]
public class LocationCollectionIntermediate
{
[DataMember(Name = "location")]
public IEnumerable<Location> Locations { get; set; }
}
[DataContract]
public class Location
{
[DataMember(Name = "id")]
public string Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "statusid")]
public string StatusId { get; set; }
}
我已将它们添加到此处的第二个代码块中,因为这样的结构似乎不必要地复杂。但是,如果您可以更改 JSON 的预期输出,我会选择第一个 block ,并将两个 Id
列更改为 int
类型。
创建这些类型是为了支持类似于 WCF Service to return JSON 设置的服务。 ,并使用以下代码进行测试:
string json;
using (var ms = new MemoryStream())
{
var ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(ResponseParent));
ser.WriteObject(ms, r);
json = System.Text.Encoding.UTF8.GetString(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length));
}
详细信息DataContractJsonSerializer
另请注意,如果您可以选择设置 RESTful Web 服务,则可以遵循 How to create a JSON WCF RESTful Service in 60 seconds 的指南。 .
关于.net - WCF - 如何在 JSON 中序列化和反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15392600/