c# ServiceContract的JSON返回值看起来与我所期望的不同

本文关键字:期望 看起来 ServiceContract JSON 返回值 | 更新日期: 2023-09-27 18:16:52

我有一个服务契约,我使用它就像一个API,有以下接口声明

namespace MyAPI
{
    [ServiceContract(Namespace = "http://MyAPI")]
    public interface IMyAPI
    {
        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "GetSomething?someInt={someInt}", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        Dictionary<string, List<string>> GetSomething(int someInt);
    }
}

在实现中,我做了如下操作

namespace MyAPI
{
    [ServiceBehavior]
    public class MyAPI : IMyAPI
    {
        public Dictionary<string, List<string>> GetSomething(int someInt)
        {
            Dictionary<string, List<string>> something = new Dictionary<string, List<string>>();
            something["FIRST KEY"] = new List<string>();
            something["SECOND KEY"] = new List<string>();
            // fill up these lists...
            return something;
        }
    }
}

但是当我返回一些东西时我得到的是这样的格式

[{"Key":"FIRST KEY","Value":[]},{"Key":"SECOND KEY","Value":[]}]

我希望JSON看起来如下

{"FIRST KEY":[], "SECOND KEY":[]}

为什么两者有区别?我可以序列化成一个字符串,但这似乎是一个额外的(不必要的)步骤。如有任何帮助,不胜感激

c# ServiceContract的JSON返回值看起来与我所期望的不同

这是因为"something"是一个容器->一个键值对列表。这就是为什么会得到["key<string>": value<Array<string>>]的结构对不起,这只是我的符号。

所以字典转换为数组,因为它是集合。它的结构是保存恰好是引用类型的键值对。这就是为什么在JSON中使用对象表示法。该值还是一个字符串列表,这就是数组语法的原因。

你期望的结构描述一个对象有两个属性,如:

class SomeThing{
    [DisplayName("FIRST KEY")]
    List<string> FirstKey;
    [DisplayName("SECOND KEY")]
    List<string> SecondKey;
}