在WCF中将对象数组序列化为JSON以符合OpenSearch [英] Serializing Array of Objects to JSON in WCF to Comply with OpenSearch

查看:119
本文介绍了在WCF中将对象数组序列化为JSON以符合OpenSearch的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写符合OpenSearch规范的OpenSearch建议服务.

I'm trying to write an OpenSearch Suggestion service that complies with the OpenSearch spec.

http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions

http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions

此规范要求服务返回一个JSON数组,其中第一个元素是字符串,随后的元素是字符串数组.我可以通过返回一个字符串数组(string [] [])并将WCF序列化为JSON来实现这一目标.但是,为了符合规范,我尝试返回一个对象数组(object []),第一个对象是字符串,其余的是字符串数组(string []).

This spec requires the service to return a JSON array with the first element being a string and the following elements being arrays of strings. I'm able to get it almost there by returning an array of strings (string[][]) and having WCF serialize this into JSON. However, in order to comply with the spec, I tried to return an array of objects (object[]), with the first one being a string, and the rest being arrays of strings (string[]).

每当我尝试返回对象数组时,它都将不起作用,例如:

Whenever I try to return the array of objects, it doesn't work, such as this:

来自服务:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SuggestionService : ISuggestionService
{
    public object[] Search(string searchTerms)
    {
        SearchSuggestions = new object[4];
        SearchText = searchTerms;
        SearchSuggestions[0] = SearchText;
        Text = new string[10];
        Urls = new string[10];
        Descriptions = new string[10];

        // Removed irrelevant ADO.NET code
        while (searchResultReader.Read() && index < 10)
        {

            Text[index] = searchResultReader["Company"].ToString();
            Descriptions[index] = searchResultReader["Company"].ToString();
            Urls[index] = "http://dev.localhost/Customers/EditCustomer.aspx?id=" +
                          searchResultReader["idCustomer"];
            index++;
        }

        SearchSuggestions[1] = Text;
        SearchSuggestions[2] = Descriptions;
        SearchSuggestions[3] = Urls;
        return SearchSuggestions;
    }

    [DataMember]
    public string SearchText { get; set; }

    [DataMember]
    public string[] Text { get; set; }

    [DataMember]
    public string[] Descriptions { get; set; }

    [DataMember]
    public string[] Urls { get; set; }

    [DataMember]
    public object[] SearchSuggestions { get; set; }
}

这是整个界面:

[ServiceContract]
public interface ISuggestionService
{
    [OperationContract]
    [WebGet(UriTemplate = "/Search?q={searchTerms}",
        BodyStyle = WebMessageBodyStyle.Bare,
        ResponseFormat = WebMessageFormat.Json)]
    object[] Search(string searchTerms);
}

这将导致服务返回错误324(net :: ERR_EMPTY_RESPONSE):未知错误".这是我唯一遇到的错误.

This causes the service to return "Error 324 (net::ERR_EMPTY_RESPONSE): Unknown error." This is the only error I've been able to get.

我不能使用对象数组存储一个字符串和三个数组吗?为了使用WCF返回符合此规范的正确JSON,我还能做些什么?

Am I not able to use an array of objects to store one string and three arrays? What else could I do in order to use WCF to return the proper JSON that complies with this spec?

添加了更多的代码

推荐答案

您发布了一堆[DataMember].请发布整个[DataContract].还向我们显示当您返回该DataContract时返回的JSON.

You posted a bunch of [DataMember]'s. Please post the entire [DataContract]. Also show us the JSON returned when you return that DataContract.

数据合同中不得包含任何行为.尝试以下操作(我还没有机会进行测试,因此需要伪造数据来进行测试):

A Data Contract should never include behavior. Try the following (I haven't had a chance to test it, and will need to fake up the data to do so):

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SuggestionService : ISuggestionService
{
    public SearchResults Search(string searchTerms)
    {
        var results = new SearchResults
                          {
                              SearchText = searchTerms,
                              Text = new string[10],
                              Urls = new string[10],
                              Descriptions = new string[10]
                          };

        // Removed irrelevant ADO.NET code
        int index = 0;
        while (searchResultReader.Read() && index < 10)
        {

            results.Text[index] = searchResultReader["Company"].ToString();
            results.Descriptions[index] = searchResultReader["Company"].ToString();
            results.Urls[index] = "http://dev.localhost/Customers/EditCustomer.aspx?id=" +
                          searchResultReader["idCustomer"];
            index++;
        }

        return results;
    }
}

[DataContract]
public class SearchResults
{
    [DataMember]
    public string SearchText { get; set; }

    [DataMember]
    public string[] Text { get; set; }

    [DataMember]
    public string[] Descriptions { get; set; }

    [DataMember]
    public string[] Urls { get; set; }
}


好吧,我阅读了足够多的该规范和JSON规范,以说服自己您确实确实需要返回一个对象数组,而不是包含对象数组的类的实例.当然,那不是很有效.这就是您需要的:


Ok, I read enough of that spec and of the JSON spec, to convince myself you really do need to return an array of objects, and not an instance of a class that contains an array of objects. Of course, that didn't quite work. Here's what you needed:

[ServiceContract]
[ServiceKnownType(typeof(string))]
[ServiceKnownType(typeof(string[]))]
public interface ISuggestionService
{
    [OperationContract]
    [WebGet(UriTemplate = "/Search?q={searchTerms}",
        BodyStyle = WebMessageBodyStyle.Bare,
        ResponseFormat = WebMessageFormat.Json)]
    object[] Search(string searchTerms);
}

我刚尝试过,它奏效了.这是JSON(添加了缩进):

I just tried it, and it worked. Here's the JSON (indentation added):

[
    "abc",
    ["Company1","Company2","Company3",...],
    ["Company1 Description","Company2 Description","Company3 Description",...],
    ["http:\/\/dev.localhost\/Customers\/EditCustomer.aspx?id=1",
     "http:\/\/dev.localhost\/Customers\/EditCustomer.aspx?id=2",
     "http:\/\/dev.localhost\/Customers\/EditCustomer.aspx?id=3",...]
]

这篇关于在WCF中将对象数组序列化为JSON以符合OpenSearch的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆