我正在尝试修复我的SendGridPlus库来处理SendGrid事件,但是我在API中对类别的处理方式不一致时遇到了一些麻烦.
在以下示例从SendGrid API引用获取的有效内容中,您会注意到category每个项的属性可以是单个字符串,也可以是字符串数组.
[
{
"email": "john.doe@sendgrid.com",
"timestamp": 1337966815,
"category": [
"newuser",
"transactional"
],
"event": "open"
},
{
"email": "jane.doe@sendgrid.com",
"timestamp": 1337966815,
"category": "olduser",
"event": "open"
}
]
Run Code Online (Sandbox Code Playgroud)
看起来像我这样制作JSON.NET的选择是在字符串进入之前修复字符串,或者配置JSON.NET以接受不正确的数据.如果我能逃脱它,我宁愿不做任何字符串解析.
有没有其他方法我可以使用Json.Net处理这个?
我有一个JObject(我使用的是Json.Net),我使用LINQ to JSON构建(也由同一个库提供).当我调用ToString()方法时JObject,它将结果输出为格式化的JSON.
如何为此设置格式为"无"?
我有一些数据,我必须序列化为JSON.我正在使用JSON.NET.我的代码结构与此类似:
public struct structA
{
public string Field1;
public structB Field2;
public structB Field3;
}
public struct structB
{
public string Subfield1;
public string Subfield2;
}
Run Code Online (Sandbox Code Playgroud)
问题是,我的JSON输出需要只有Field1OR Field2或Field3- 它取决于使用哪个字段(即不为空).默认情况下,我的JSON看起来像这样:
{
"Field1": null,
"Field2": {"Subfield1": "test1", "Subfield2": "test2"},
"Field3": {"Subfield1": null, "Subfield2": null},
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用NullValueHandling.Ignore,但这给了我看起来像这样的JSON:
{
"Field2": {"Subfield1": "test1", "Subfield2": "test2"},
"Field3": {}
}
Run Code Online (Sandbox Code Playgroud)
而我需要的是:
{
"Field2": {"Subfield1": "test1", "Subfield2": "test2"},
}
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来实现这一目标?
我正在查看一个具有以下编码的WebAPI应用程序示例:
json.SerializerSettings.PreserveReferencesHandling
= Newtonsoft.Json.PreserveReferencesHandling.Objects;
Run Code Online (Sandbox Code Playgroud)
和另一个有这个编码:
json.SerializerSettings.ReferenceLoopHandling
= Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Run Code Online (Sandbox Code Playgroud)
既没有解释为什么选择每一个.我是WebAPI的新手,所以有人可以通过简单的方式向我解释这些差异是什么以及为什么我可能需要使用一个而不是另一个.
我已经和JSON.net合作了一段时间.我已经编写了自定义转换器和自定义合同解析器(通常来自修改SO和Newtonsoft网站上的示例),它们工作正常.
除了例子之外,我面临的挑战是,我什么时候应该使用其中一个(或两个)进行处理.根据我自己的经验,我基本上已经确定合同解决方案更简单了,所以如果我可以用他们做我需要的东西,我会这样做; 否则,我使用自定义JsonConverters.但是,我进一步知道两者有时一起使用,因此概念变得更加不透明.
问题:
我正在使用Json.Net来解析数组.我想要做的是从数组中提取名称/值对,并在解析JObject时将它们分配给特定的变量.
这是我在数组中得到的:
[
{
"General": "At this time we do not have any frequent support requests."
},
{
"Support": "For support inquires, please see our support page."
}
]
Run Code Online (Sandbox Code Playgroud)
这就是我在C#中得到的:
WebRequest objRequest = HttpWebRequest.Create(dest);
WebResponse objResponse = objRequest.GetResponse();
using (StreamReader reader = new StreamReader(objResponse.GetResponseStream()))
{
string json = reader.ReadToEnd();
JArray a = JArray.Parse(json);
//Here's where I'm stumped
}
Run Code Online (Sandbox Code Playgroud)
我是JSON和Json.Net的新手,所以它可能是其他人的基本解决方案.我基本上只需要在foreach循环中分配名称/值对,以便我可以在前端输出数据.有没有人这样做过?
我在C#中使用JSON.NET来解析来自Klout API的响应.我的回答是这样的:
[
{
"id": "5241585099662481339",
"displayName": "Music",
"name": "music",
"slug": "music",
"imageUrl": "http://kcdn3.klout.com/static/images/music-1333561300502.png"
},
{
"id": "6953585193220490118",
"displayName": "Celebrities",
"name": "celebrities",
"slug": "celebrities",
"imageUrl": "http://kcdn3.klout.com/static/images/topics/celebrities_b32741b6703151cc7bd85fba24c44c52.png"
},
{
"id": "5757029936226020304",
"displayName": "Entertainment",
"name": "entertainment",
"slug": "entertainment",
"imageUrl": "http://kcdn3.klout.com/static/images/topics/Entertainment_7002e5d2316e85a2ff004fafa017ff44.png"
},
{
"id": "3718",
"displayName": "Saturday Night Live",
"name": "saturday night live",
"slug": "saturday-night-live",
"imageUrl": "http://kcdn3.klout.com/static/images/icons/generic-topic.png"
},
{
"id": "8113008320053776960",
"displayName": "Hollywood",
"name": "hollywood",
"slug": "hollywood",
"imageUrl": "http://kcdn3.klout.com/static/images/topics/hollywood_9eccd1f7f83f067cb9aa2b491cd461f3.png"
}
]
Run Code Online (Sandbox Code Playgroud)
如您所见,它包含5个id标签.也许下次它会是6或1或其他一些数字.我想迭代JSON并获取每个id标记的值.在不知道会有多少循环的情况下,我无法运行循环.我怎么解决这个问题?
有些代码(我无法更改)使用Newtonsoft.Json DeserializeObject<T>(strJSONData)从Web请求中获取数据并将其转换为类对象(我可以更改类).通过使用我的类属性进行装饰,[DataMember(Name = "raw_property_name")]我可以将原始JSON数据映射到我的类中的正确属性.有没有办法可以将JSON复杂对象的子属性映射到一个简单的属性?这是一个例子:
{
"picture":
{
"id": 123456,
"data":
{
"type": "jpg",
"url": "http://www.someplace.com/mypicture.jpg"
}
}
}
Run Code Online (Sandbox Code Playgroud)
除了URL之外,我不关心任何其他图片对象,因此不想在我的C#类中设置复杂对象.我真的只想要这样的东西:
[DataMember(Name = "picture.data.url")]
public string ProfilePicture { get; set; }
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我需要将复杂的JSON blob反序列化为标准的.NET容器,以便在不了解JSON的代码中使用.它期望的事情是在标准的.NET类型,具体地Dictionary<string, object>或List<object>其中"对象"可以是原语或递归(词典或列表).
我不能使用静态类型来映射结果,并且JObject/JToken不适合.理想情况下,有一些方法(通过Contracts可能?)将原始JSON转换为基本的.NET容器.
我一直在寻找任何方式来哄骗JSON.NET反序列化器在遇到"{}"或"[]"时创建这些简单类型,但收效甚微.
任何帮助赞赏!
有没有办法忽略使用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)