UPDATE
感谢所有的答案.我正在进行一个新项目,看起来我终于找到了底层:看起来下面的代码实际上应该归咎于:
public static HttpResponseMessage GetHttpSuccessResponse(object response, HttpStatusCode code = HttpStatusCode.OK)
{
return new HttpResponseMessage()
{
StatusCode = code,
Content = response != null ? new JsonContent(response) : null
};
}
Run Code Online (Sandbox Code Playgroud)
别处...
public JsonContent(object obj)
{
var encoded = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore } );
_value = JObject.Parse(encoded);
Headers.ContentType = new MediaTypeHeaderValue("application/json");
}
Run Code Online (Sandbox Code Playgroud)
假设它是WebAPI,我忽略了看似无害的JsonContent但没有.
这在任何地方都可以使用......我能说第一个,wtf吗?或许应该是"为什么他们这样做?"
原始问题如下
人们会认为这将是一个简单的配置设置,但现在我已经躲过太久了.
我看过各种解决方案和答案:
https://gist.github.com/rdingwall/2012642
似乎不适用于最新的WebAPI版本......
以下似乎不起作用 - 属性名称仍然是PascalCased.
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
json.SerializerSettings.ContractResolver …Run Code Online (Sandbox Code Playgroud) 我有一个Web Api项目配置如下:
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Run Code Online (Sandbox Code Playgroud)
但是,我希望字典键的外壳保持不变.是否有任何属性Newtonsoft.Json我可以使用一个类来表示我希望在序列化期间套管保持不变?
public class SomeViewModel
{
public Dictionary<string, string> Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 许多SO线程都涵盖了在应用程序级别覆盖Web API的默认JSON序列化程序设置.但是如何在动作级别配置其设置?例如,我可能想要在我的一个操作中使用camelcase属性进行序列化,但不能在其他操作中进行序列化.
我正在使用Json.NET包含Guid类型的私有字段和该字段的公共属性的对象反序列化.当Guid我的json中的值为null时,我想分配Guid.Empty给我的字段.
public class MyClass
{
private Guid property;
public Guid Property
{
get { return property; }
set
{
if (value == null)
{
property = Guid.Empty;
}
else
{
property = value;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是deserializer想要访问私有字段,导致我在尝试反序列化时遇到此错误:
将值{null}转换为类型'System.Guid'时出错.路径'[0] .property',第6行,第26位.
如何让它忽略私有字段并使用公共属性呢?
在json反序列化攻击中观看此视频,它显示了这一点json,可用于在任何反序列化它的应用程序上触发任意代码执行.
现在在我的应用程序中,我甚至从未使用过类型的json.我总是反序列化为动态对象或JObjects.在$type今天早上另一次无关的谈话之前,我甚至都不知道这个房产.
在我的json设置中是否有一种方法可以告诉它永远不会写或读取此属性?这不是我想要的东西.
我从Angularjs服务调用WebApi控制器Get方法.
角度服务:
app.service('MyService', ['$http', function ($http) {
var getMyObjects = function () {
var myObjects;
var promise = $http.get('/api/objects/').success(function (data) {
myObjects = data;
}).error(function (data, status, headers, config) {
});
return promise;
};
return {
myObjects: myObjects
};
}]);
Run Code Online (Sandbox Code Playgroud)
WebApi Get方法:
public class ObjectsController : ApiController
{
public IEnumerable<MyObject> Get()
{
return _objectRepository.GetAll().ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
我500 server error在客户端获得了一个,其内部例外是:
ExceptionMessage: "Error getting value from 'IdentityEqualityComparer' on
'NHibernate.Proxy.DefaultLazyInitializer'."
ExceptionType: "Newtonsoft.Json.JsonSerializationException"
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这个问题?
编辑:
我通过添加以下一个班轮来解决上述异常,WebApiConfig.cs根据这个答案:
((DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.
ContractResolver).IgnoreSerializableAttribute …Run Code Online (Sandbox Code Playgroud) 当我将JSON取消病毒化到下面的C#对象时,无论是显式地使用Newtonsoft还是通过ASP.NET Web Api的模型绑定机制,字符串id值都会自动转换为int.我希望它会抛出异常或引发错误,因为存在类型不匹配.这是JSON应该如何在规范中工作?如果没有,我该如何防止这种自动转换?
JSON:{"id":"4", "name":"a"}
C#模型:int id; string name
public Guid AddJobs(JObject parametrs)
{
dynamic jsonParameters = parametrs;
JobViewModel job = jsonParameters.Job.ToObject<JobViewModel>();
}
Run Code Online (Sandbox Code Playgroud)
以上是我的代码。我正在尝试使用上述方法反序列化此模型。问题是它一直给我一个例外,即日期格式不正确,因为它不期望“dd-mm-yyyy”。请帮我解决这个问题。
在我的项目中,我编写了一个自定义 json 转换器来修剪 string 属性中存在的空格。
这是我们将使用的典型类的示例,
public class Candidate
{
public string CandidateName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的自定义 json 转换器
public class StringSanitizingConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue , JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.String)
if (reader.Value != null)
{
string sanitizedString = (reader.Value as string).Trim();
if (StringSanitizeOptions.HasFlag(StringSanitizeOptions.ToLowerCase))
sanitizedString = sanitizedString.ToLowerInvariant();
return sanitizedString;
}
return reader.Value;
}
public override void …Run Code Online (Sandbox Code Playgroud) Json.Net没有将其接收到的对象反序列化为我的 Control 类的正确派生类。(请参阅以下对该问题的解释。另请注意,我认为这是解释该问题所需的最少代码量。提前感谢您审阅此问题。)
我正在尝试将以下类序列化为 JSON 或从 JSON 反序列化。
public class Page {
public Guid Id { get; set; }
public Guid CustomerId { get; set; }
public IList<Control> Controls { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是 Control 类:
public class Control : ControlBase
{
public override Enums.CsControlType CsControlType { get { return Enums.CsControlType.Base; } }
}
Run Code Online (Sandbox Code Playgroud)
这是 ControlBase 抽象类:
public abstract class ControlBase
{
public Guid Id { get; set; }
public virtual Enums.CsControlType CsControlType { get; }
public …Run Code Online (Sandbox Code Playgroud)