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

标签 .net json wcf serialization

我在 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/

相关文章:

c# - 如何找到当前函数调用者的对象实例的类型?

.net - 如何组织具有多个登录的端到端(.NET + Selenium)测试?

javascript - Ajax 调用外部 URL

php - 未捕获的类型错误。 Item.replace 不是函数,autoComplete 插件

c# - 模拟管理系统?

c# - 使用 C# 创建嵌套的 json

Internet 场景中的 WCF 安全性

xml - WCF 契约(Contract)第一个 : No methods are exposed

c# - 使用传输模式证书保护 WCF

.net - 有没有一种方法可以生成编译器错误?