首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JObject返回OpenType时出错

使用JObject返回OpenType时出错
EN

Stack Overflow用户
提问于 2014-12-02 15:06:47
回答 1查看 1.1K关注 0票数 2

我为我的Web实现了http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/use-open-types-in-odata-v4。我可以为这个属性发送随机值,如String、int、array等。但是,试图发送回JObject失败了,我如何才能发送回JObject?

代码语言:javascript
复制
HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: application/json; odata.metadata=minimal; odata.streaming=true
Server: Microsoft-IIS/8.0
OData-Version: 4.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RDpcQ29uZmlndXJhdGlvblxDb25maWd1cmF0aW9uU3RvcmVcQ29uZmlndXJhdGlvblNlcnZpY2UuQXBpXGFwaVxTZXJ2aWNlcygnRW5jb2RpbmcnKVxDb25maWd1cmF0aW9ucw==?=
X-Powered-By: ASP.NET
Date: Tue, 02 Dec 2014 14:56:01 GMT
Content-Length: 4046

{
  "error":{
    "code":"","message":"An error has occurred.","innererror":{
      "message":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata.metadata=minimal; odata.streaming=true'.","type":"System.InvalidOperationException","stacktrace":"","internalexception":{
        "message":"The given model does not contain the type 'Newtonsoft.Json.Linq.JObject'.","type":"System.InvalidOperationException","stacktrace":"   at System.Web.OData.Formatter.Serialization.ODataSerializerContext.GetEdmType(Object instance, Type type)\r\n   at System.Web.OData.Formatter.Serialization.ODataEdmTypeSerializer.AppendDynamicProperties(Object source, IEdmStructuredTypeReference structuredType, ODataSerializerContext writeContext, List`1 declaredProperties)\r\n   at System.Web.OData.Formatter.Serialization.ODataComplexTypeSerializer.CreateODataComplexValue(Object graph, IEdmComplexTypeReference complexType, ODataSerializerContext writeContext)\r\n   at System.Web.OData.Formatter.Serialization.ODataComplexTypeSerializer.CreateODataValue(Object graph, IEdmTypeReference expectedType, ODataSerializerContext writeContext)\r\n   at System.Web.OData.Formatter.Serialization.ODataCollectionSerializer.CreateODataCollectionValue(IEnumerable enumerable, IEdmTypeReference elementType, ODataSerializerContext writeContext)\r\n   at System.Web.OData.Formatter.Serialization.ODataCollectionSerializer.CreateODataValue(Object graph, IEdmTypeReference expectedType, ODataSerializerContext writeContext)\r\n   at System.Web.OData.Formatter.Serialization.ODataEdmTypeSerializer.CreateProperty(Object graph, IEdmTypeReference expectedType, String elementName, ODataSerializerContext writeContext)\r\n   at System.Web.OData.Formatter.Serialization.ODataEntityTypeSerializer.CreateStructuralProperty(IEdmStructuralProperty structuralProperty, EntityInstanceContext entityInstanceContext)\r\n   at System.Web.OData.Formatter.Serialization.ODataEntityTypeSerializer.CreateStructuralPropertyBag(IEnumerable`1 structuralProperties, EntityInstanceContext entityInstanceContext)\r\n   at System.Web.OData.Formatter.Serialization.ODataEntityTypeSerializer.CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext)\r\n   at System.Web.OData.Formatter.Serialization.ODataEntityTypeSerializer.WriteEntry(Object graph, ODataWriter writer, ODataSerializerContext writeContext)\r\n   at System.Web.OData.Formatter.Serialization.ODataEntityTypeSerializer.WriteObjectInline(Object graph, IEdmTypeReference expectedType, ODataWriter writer, ODataSerializerContext writeContext)\r\n   at System.Web.OData.Formatter.Serialization.ODataFeedSerializer.WriteFeed(IEnumerable enumerable, IEdmTypeReference feedType, ODataWriter writer, ODataSerializerContext writeContext)\r\n   at System.Web.OData.Formatter.Serialization.ODataFeedSerializer.WriteObjectInline(Object graph, IEdmTypeReference expectedType, ODataWriter writer, ODataSerializerContext writeContext)\r\n   at System.Web.OData.Formatter.Serialization.ODataFeedSerializer.WriteObject(Object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)\r\n   at System.Web.OData.Formatter.ODataMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content, HttpContentHeaders contentHeaders)\r\n   at System.Web.OData.Formatter.ODataMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n   at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__1b.MoveNext()"
      }
    }
  }
}

以下是一些可能有帮助的细节

类定义

代码语言:javascript
复制
public sealed class Configuration
{
    public string ID { get; set; }
    public ConfigurationValue[] Values
    {
        get;
        set;
    }
}

public sealed class ConfigurationValue
{
    public IDictionary<string, object> ScopedValue { get; set; }
}

在控制器中,如果我按以下方式创建一个对象,它就会工作

代码语言:javascript
复制
var config = new Configuration{ ID="1", Values = new [] { new ConfigurationValue { ScopedValue = new Dictionary<string, object> {{"Val","1"}}}}};

但是,如果我这样做,它就会爆炸

代码语言:javascript
复制
var value=JsonConvert.DeserializeObject(@"{'RetryInterval': 60,'MaxRetryCount': 100}");
var config = new Configuration{ ID="1", Values = new [] { new ConfigurationValue { ScopedValue = new Dictionary<string, object> {{"Val",value}}}}};
EN

回答 1

Stack Overflow用户

发布于 2014-12-02 19:00:54

问题不在你发布的代码中,它运行得很完美。问题是OData无法与您的类一起工作。

OData不支持所有类型,更明确地说,它不支持没有setter和getter的类型。

Dictionary基本上是KeyValuePair对象的列表。KeyValuePair使用索引,没有get;set;

解决方案是使用具有两个属性的普通类,并将它们放入List中,而不是使用Dictionary

代码语言:javascript
复制
public class ScopedValue
{
    public string Key { get; set; }
    public object Value { get; set; }
}

public sealed class ConfigurationValue
{
    public List<ScopedValue> ScopedValues { get; set; }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27252559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档