相关疑难解决方法(0)

如何在JSON对象上序列化__type属性

我从a WebMethod中返回的每个对象都ScriptService被包装到一个JSON对象中,并且数据位于一个名为的属性中d.没关系.但我不希望将附加__type属性提供给客户端,因为我使用jQuery进行手动处理.

可能吗?

c# asp.net json asmx javascriptserializer

62
推荐指数
5
解决办法
3万
查看次数

没有键/值文本的POST JSON字典

我有一个类似这样的WCF端点:

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, UriTemplate = "")]
Stream DoWork(Dictionary<string, string> items);
Run Code Online (Sandbox Code Playgroud)

为了将任何内容传递给我的服务,我必须像这样构建我的JSON:

{"items":[{"Key":"random1","Value":"value1"}, {"Key":"random2","Value":"value2"}]}
Run Code Online (Sandbox Code Playgroud)

我真正希望它看起来像这样:

{"items":{"random1":"value1","random2":"value2"}}
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个目标?

c# wcf serialization json

8
推荐指数
1
解决办法
2829
查看次数

发布子类集合

我要求用户编辑潜在客户的报价列表,报价可以是不同的类型,例如:

  • QuoteForProductTypeA
  • QuoteForProductTypeB

所有引用类型共享一个公共基类,例如QuoteBase.

我的报价在前端显示正常,并且似乎也回发了正确的数据.

但是,在服务器上它显然不知道要使用哪个子类,所以只使用基类.

我想我需要一些WebApi的自定义模型绑定器来检查一个隐藏的字段,比如ModelType,它包含集合中对象的类型,然后模型绑定器创建一个这种类型的新对象,并绑定我发布的属性此对象的值.

但是,我现在很困难,只有很少的文档/博客如何做到这一点.

我检查了WebApi的源代码,看看我是否可以扩展默认模型绑定器,但任何默认值都是密封类.

我只能通过它的外观实现IModelBinder,我可以通过查找名为ModelType的值来创建正确的模型类型,但是我不知道如何填充子类中的其余值,如果有默认值模型绑定器我继承自我只会调用基类绑定方法.

c# model-binding asp.net-web-api knockout.js

6
推荐指数
1
解决办法
3897
查看次数

如何从 WCF REST 方法将自定义类型值的字典作为常规 JSON 对象返回?

假设我有一个如下所示的自定义类型:

[DataContract]
public class CompositeType
{
    [DataMember]
    public bool HasPaid
    {
        get;
        set;
    }

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

和一个 WCF REST 接口,如下所示:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    Dictionary<string, CompositeType> GetDict();
}
Run Code Online (Sandbox Code Playgroud)

那么我如何实现该方法以返回一个如下所示的 JSON 对象...

{"fred":{"HasPaid":false,"Owner":"Fred Millhouse"},"joe":{"HasPaid":false,"Owner":"Joe McWirter"},"bob":{"HasPaid":true,"Owner":"Bob Smith"}}
Run Code Online (Sandbox Code Playgroud)

我不希望它看起来像这样:

[{"Key":"fred","Value":{"HasPaid":false,"Owner":"Fred Millhouse"}},{"Key":"joe","Value":{"HasPaid":false,"Owner":"Joe McWirter"}},{"Key":"bob","Value":{"HasPaid":true,"Owner":"Bob Smith"}}]
Run Code Online (Sandbox Code Playgroud)

理想情况下,我不想改变方法的返回类型。

我尝试了许多不同的方法,但找不到有效的解决方案。令人烦恼的是,很容易用一行代码生成正确形状的 JSON 对象结构Newtonsoft.Json

string json = JsonConvert.SerializeObject(dict);
Run Code Online (Sandbox Code Playgroud)

其中dict定义为:

Dictionary<string, CompositeType> dict = new Dictionary<string, CompositeType>();
dict.Add("fred", new CompositeType { HasPaid = false, Owner = …
Run Code Online (Sandbox Code Playgroud)

c# rest wcf json

5
推荐指数
1
解决办法
1131
查看次数

更改从wcf服务方法返回的json对象包装器名称

我创建了一个WCF 3.5应用程序,其方法名称TestMe如下所示:

 [OperationContract]
        [WebInvoke(UriTemplate = "/Login", Method = "POST",
            BodyStyle = WebMessageBodyStyle.Wrapped,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json)]
        MyDictionary<string, string> TestMe(string param1, string param2);
Run Code Online (Sandbox Code Playgroud)

MyDictionary使用以下链接创建:https://stackoverflow.com/a/7590189/546033

这里的一切都很好.但问题是从以下实现的方法返回数据时:

MyDictionary<string, string> success = new MyDictionary<string, string>();
success["desc"] = "Test";
return success;
Run Code Online (Sandbox Code Playgroud)

它返回以下json:

{"TestMeResult":{"desc":"Test"}}
Run Code Online (Sandbox Code Playgroud)

而我需要的是:

{"success":{"desc":"Test"}}
Run Code Online (Sandbox Code Playgroud)

success对象名称在哪里.有什么办法可以解决这个问题?

c# asp.net wcf json wcf-binding

4
推荐指数
1
解决办法
5527
查看次数

奇怪的结果将字典序列化为JSON

我目前正在考虑使用WCF进行REST服务.我遇到的一个问题是序列化字典结果.我以前在建议的包装类这篇文章连载由字符串表示的日期(如"20.10.2011")和布尔变量的字典.当我测试结果时,我看到了这个:

{
    "DeparturesResult":
    {
        "_x0032_1.10.2011":true,
        "_x0032_4.10.2011":true,
        "_x0032_6.10.2011":true,
        "_x0032_8.10.2011":true,
        "_x0033_1.10.2011":true
    }
}
Run Code Online (Sandbox Code Playgroud)

..每个键中的第一个字符都写成UTF-8代码.如果我在字符串前加上字母,我不会遇到这个问题.(例如d21.10.2011)

这是我用来序列化字典的代码:public class FlService:IFlService {#region IFlService Members

    public AjaxDictionary<string, bool> Departures(string from, string to, string portFrom, string portTo)
    {
        var startDate = DateTime.Today; // DateTime.ParseExact(from, "dd.MM.yyyy", null);
        var endDate = DateTime.ParseExact(to, "dd.MM.yyyy", null);
        var client = new Timetables();
        var result = client.GetJourneys(startDate, endDate.AddDays(1), portFrom, portTo);
        var js = result
            .GroupBy(x => x.DepartureTime.CarResToDateTime())
            .Select(x => x.Key)
            .OfType<DateTime>()
            .Select(x => x.Date)
            .Distinct()
            .ToDictionary(x => x.Date.ToString("dd.MM.yyy"), x => true);
        return …
Run Code Online (Sandbox Code Playgroud)

c# serialization

2
推荐指数
1
解决办法
512
查看次数