我正在尝试编写包含newtonsoft JSON.net组件的Web API。
我的代码很简单:
public object GetJsonFile(int id = 1) {
using (StreamReader r = new StreamReader(myJsonFile)) {
string json;
// todo: build logic to only grab latest when an id is supplied
json = r.ReadToEnd();
object jsonObject = JsonConvert.DeserializeObject(json);
return jsonObject;
}
在测试页面时,我得到了可怕的" Type' Newtonsoft.Json.Linq.JToken'是一个不受支持的递归收集数据协定。考虑修改集合的定义' Newtonsoft.Json.Linq.JToken'删除对自己的引用。"错误。
我已经完成了挖掘工作,并且每个人似乎都建议取消检查"重复使用所有引用程序集中的类型",但这似乎只用于服务引用,我的项目不使用。我确实找到了这样做的地方,但看到我没有引用服务,我无法配置它。
我在Visual Studio中不是那样,所以请放轻松我;)
答案 0 :(得分:0)
我从未设法弄清楚如何回避这个问题。我最终做的是将JSON中的实体创建为类,并让JSON.NET将JSON反序列化为该类。
答案 1 :(得分:0)
使用Json.Net设置通过适当的设置进行序列化:
对于您的web.api控制器使用InvalidDataContract异常:
public static void Register(HttpConfiguration config)
{
config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings()
{
Formatting = Formatting.Indented,
TypeNameHandling = TypeNameHandling.Auto,
ContractResolver = new CamelCasePropertyNamesContractResolver(),
NullValueHandling = NullValueHandling.Ignore,
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
};
您对JsonConvert使用的Json.Net默认设置:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
Formatting = Formatting.Indented,
TypeNameHandling = TypeNameHandling.Auto,
ContractResolver = new CamelCasePropertyNamesContractResolver(),
NullValueHandling = NullValueHandling.Ignore,
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
};