WCF - 如何在JSON中序列化和反序列化?

Pav*_*nda 5 .net wcf json serializer

我在WCF中写了几个类(数据契约和服务契约),我试图在JSON中序列化和反序列化.如果我需要以下JSON结构,我将如何创建DataContract:

{
  "response": {
    "locations": {
      "location": [
        {
          "id": "12",
          "name": "Hello",
          "statusid": "78"
        },
        {
          "id": "5",
          "name": "Ann",
          "statusid": "8"
        }
      ]
    },
    "error": "404 error"
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的结构非常简单,在如下所述的位置下可以有几个位置细节.所以我需要得到一个数组/列表到"位置"数据成员,如下所述.目前我只有以下DataContract:

[DataContract]
    public class Response
    {
        [DataMember]
        public string locations { get; set; }

        [DataMember]
        public string error{ get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

请告诉我如何解决这个问题?

Mik*_*rie 11

您要查找的完整对象应该构造为:

[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; }
}
Run Code Online (Sandbox Code Playgroud)

你需要设置对象分层结构,如由所指示的{},以及了IEnumerable /阵列的属性,由所指示的[]从你的期望的JSON输出.

该网站可能令人困惑,因为没有简单的示例,但请查看介绍JSON以获得对语法的基本了解.我带来的另一个好网站,只有一些简单的例子,是ASP.NET Web API中的JSON和XML序列化.

感谢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; }
}
Run Code Online (Sandbox Code Playgroud)

我在这里将这些添加到第二个代码块中,因为这样的结构似乎不必要地复杂化.但是,如果您处于可以更改JSON的预期输出的位置,我将使用第一个块,并将两Id列放入int类型中进行额外更改.

创建这些类型是为了支持类似于WCF服务中的设置以返回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)); 
}
Run Code Online (Sandbox Code Playgroud)

有关DataContractJsonSerializer的详细信息

另请注意,如果您可以选择设置RESTful Web服务,则可以在60秒内遵循如何创建JSON WCF RESTful服务的准则.


小智 3

访问http://json.codeplex.com/。使用

JsonConvert.SerializeObject()
Run Code Online (Sandbox Code Playgroud)

将您的对象转换为 JSON 字符串。使用

JsonConvert.PopulateObject
Run Code Online (Sandbox Code Playgroud)

将 JSON 字符串转换为对象。