有没有办法忽略使用Json.NET序列化程序的get-only属性但不使用JsonIgnore属性?
例如,我有一个具有这些get属性的类:
public Keys Hotkey { get; set; }
public Keys KeyCode
{
get
{
return Hotkey & Keys.KeyCode;
}
}
public Keys ModifiersKeys
{
get
{
return Hotkey & Keys.Modifiers;
}
}
public bool Control
{
get
{
return (Hotkey & Keys.Control) == Keys.Control;
}
}
public bool Shift
{
get
{
return (Hotkey & Keys.Shift) == Keys.Shift;
}
}
public bool Alt
{
get
{
return (Hotkey & Keys.Alt) == Keys.Alt;
}
}
public …Run Code Online (Sandbox Code Playgroud) 我正在使用Json.Net进行序列化.我有一个带有词典的类:
public class Test
{
public string X { get; set; }
public Dictionary<string, string> Y { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式序列化此对象以获取以下JSON
{
"X" : "value",
"key1": "value1",
"key2": "value2"
}
Run Code Online (Sandbox Code Playgroud)
其中"key1","key2"是字典中的键?
我有一个像这样的json块:
{
"ADDRESS_MAP":{
"ADDRESS_LOCATION":{
"type":"separator",
"name":"Address",
"value":"",
"FieldID":40
},
"LOCATION":{
"type":"locations",
"name":"Location",
"keyword":{
"1":"LOCATION1"
},
"value":{
"1":"United States"
},
"FieldID":41
},
"FLOOR_NUMBER":{
"type":"number",
"name":"Floor Number",
"value":"0",
"FieldID":55
},
"self":{
"id":"2",
"name":"Address Map"
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何获取此令牌包含的所有关键项.例如,从上面的代码我想要"ADRESS_LOCATION","LOCATION","FLOOR_NUMBER"和"self".
谢谢
我在我的MVC 4程序中使用Json.net.
我有一个item班级的对象Item.
我做了:
string j = JsonConvert.SerializeObject(item);
现在,我想添加一个额外的属性,如"feeClass" : "A"成j.
我如何使用Json.net来实现这一目标?
我正在使用Newtonsoft JSON序列化程序,它适用于大多数对象.
不幸的是,JsonSerializationException当我尝试序列化大型对象时,我得到了一个,其中一个成员抛出一个NullReferenceException.
反正有没有忽略违规成员并序列化对象的其余部分?
我想也许在JsonSerializerSettings?
这是我想要做的简化版本:
private class TestExceptionThrowingClass
{
public string Name { get { return "The Name"; } }
public string Address { get { throw new NullReferenceException(); } }
public int Age { get { return 30; } }
}
[Test]
public void CanSerializeAClassWithAnExceptionThrowingMember()
{
// Arrange
var toSerialize = new TestExceptionThrowingClass();
// Act
var serializerSettings = new Newtonsoft.Json.JsonSerializerSettings();
serializerSettings.MaxDepth = 5;
serializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
serializerSettings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
serializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; …Run Code Online (Sandbox Code Playgroud) 我想以System.Security.Claims.Claim下列方式反序列化一个序列化的对象:
{
"Issuer" : "LOCAL AUTHORITY",
"OriginalIssuer" : "LOCAL AUTHORITY",
"Type" : "http://my.org/ws/2015/01/identity/claims/mytype",
"Value" : "myvalue",
"ValueType" : "http://www.w3.org/2001/XMLSchema#string"
}
Run Code Online (Sandbox Code Playgroud)
我得到的是JsonSerializationException:
无法找到用于System.Security.Claims.Claim类型的构造函数.一个类应该有一个默认的构造函数,一个带参数的构造函数或一个用JsonConstructor属性标记的构造函数.
经过一些调查后,我终于理解了上面消息中一个的含义:JSON反序列化器找不到正确的构造函数 - 在Claim类型的情况下- 带有参数的多个构造函数(尽管存在一个构造函数,其参数完全匹配上述属性).
有没有办法告诉反序列化器选择哪个构造函数而不将该JsonConstructor属性添加到该mscorlib类型?
几年前, Daniel Halan用Json.NET补丁解决了这个问题.这些天有没有办法解决这个问题而不修改Json.NET?
我使用C#在ASP.NET 4中使用我的Web API遇到了一个小问题.我正在尝试创建一个前端GUI,它通过多个Web API发送和接收数据.拥有多个API的原因与我们的网络有关,该网络由多个安全区域组成.服务器位于不同的区域,一个简单的请求可能需要通过3个不同的API.
具体来说,我正在从GUI向第一个API发送一个JSON对象.应该将JSON对象转发到下一个API,然后从那里创建一个新的JSON对象,并在同一路径下返回.
路径本身工作正常.问题是JSON对象一旦返回GUI就无法解析.我收到一个用引号括起来的JSON字符串,每个API一次.
字符串可能会像这样开始:
Hey! I am a string, or a JSON object of sorts!
API之间的第一跳给了我:
"Hey! I am a string, or a JSON object of sorts!"
在下一跳之后它看起来像这样:
"\"Hey! I am a string, or a JSON object of sorts!\""
当我的GUI掌握它时,我们有这样的事情:
"\"\\\"Hey! I am a string, or a JSON object of sorts!\\\"\""
这是解析失败的原因,原因很明显.JSON对象本身已正确格式化,但所有引号都会导致JSON.net解析器出现问题(对象内的所有引号也会被多次包装).
到目前为止我尝试过的是将请求作为application/json类型和text/plain类型发送.两者都做了同样的事情.API返回一个HttpResponseMessage,使用ReadAsStringAsync()读取.我也试图避免字符串读取,只是直接从HttpRequestMessage读取到HttpResponseMessage并仅在GUI中执行ReadAsStringAsync(),但问题仍然存在.JSON字符串是使用JSON.nets Serialize() - 方法创建的,并使用StringContent()放入HttpContent.这似乎正确地完成了工作.我相信当API和GUI收到HttpResponseMessage时会生成引号.
知道我如何发送和接收JSON字符串作为原始字符串,这是不是以任何方式处理?
我可以通过在每个API上将对象解析为JToken或JObject并再次序列化来绕过此行为.然而,这不是一个好的解决方案 - 我宁愿API只是按照他们获得它的方式转发消息,而不是对它做任何事情.我使用路由查看了前进,但是有许多授权内容正在进行,这需要我使用API操作,而不是重定向路由.
澄清(TLDR):理想的解决方案是让API简单地传递消息而不解析或读取任何内容.只要消息来源被授权,请求就会被加密并且请求的URL有效,消息本身对每个"代理"API都无关紧要.
在创建自定义Json转换器时,需要覆盖的方法之一是:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
Run Code Online (Sandbox Code Playgroud)
什么是"existingValue"参数用于?在这种情况下,变量名称"existingValue"是什么意思?
List<User> list = LoadUsers();
JObject json = new JObject();
json["users"] = new JValue(list);
Run Code Online (Sandbox Code Playgroud)
似乎没有工作?
错误:
Could not determine JSON object type for type System.Collections.Generic.List`1
Run Code Online (Sandbox Code Playgroud) 我正在使用Json.NET进行我正在进行的项目.从外部API,我接收的JSON具有作为对象的属性,但是当它们为空时,传递"false".
例如:
data: {
supplier: {
id: 15,
name: 'TheOne'
}
}
Run Code Online (Sandbox Code Playgroud)
也可能是:
data: {
supplier: false
}
Run Code Online (Sandbox Code Playgroud)
我应该如何定义供应商属性,以便将供应商反序列化为Supplier对象或为null.
现在我有:
public class Data {
[JsonProperty("supplier")]
public SupplierData Supplier { get; set; }
}
public class SupplierData {
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是现在当供应商的值为'false'时尝试反序列化时,它会失败.当JSON值为"false"时,我希望Supplier属性为null.
我希望有人知道如何做到这一点.谢谢.