我正在构建一个Web API,并且对的JSON序列化遇到了麻烦DateTimes。经过一些测试之后,我只能得出结论,Newtonsoft.Json.JsonConvert和/或Newtonsoft 的行为IsoDateTimeConverter不是我所期望的。
考虑一下:
// Arrange
var noonUtc = new DateTime(2016, 05, 12, 12, 0, 0, DateTimeKind.Utc);
var noon = new DateTime(2016, 05, 12, 12, 0, 0, DateTimeKind.Unspecified);
var settings = new JsonSerializerSettings();
settings.Converters.Add(new IsoDateTimeConverter
{
Culture = CultureInfo.InvariantCulture,
DateTimeStyles = DateTimeStyles.AdjustToUniversal
});
// Act
var utcJson = JsonConvert.SerializeObject(noonUtc, settings); // "\"2016-05-12T12:00:00Z\""
var json = JsonConvert.SerializeObject(noon, settings); // "\"2016-05-12T10:00:00Z\""
... // Assertions
Run Code Online (Sandbox Code Playgroud)
好的,所以DateTimewith 的时间DateTimeKind.Unspecified已从12点调整为10点。我现在在斯德哥尔摩,比世界协调时间早两个小时,真是太公平了。
但是,让我们将序列化程序设置更改为use DateTimeStyles.AssumeUniversal,如下所示:
settings.Converters.Add(new IsoDateTimeConverter
{ …Run Code Online (Sandbox Code Playgroud) 我有一个课程如下:
public class Usage
{
public string app { get; set; }
public Dictionary<string, string> KVPs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我使用这段代码时:
var json = new JavaScriptSerializer().Serialize(usage);
Run Code Online (Sandbox Code Playgroud)
它给了我这个JSON:
{"app":"myapp", "KVPs":{"k1":"v1", "k2":"v2"}}
Run Code Online (Sandbox Code Playgroud)
我想要它返回这样的东西:
{"app":"myapp", "k1":"v1", "k2":"v2"}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?我目前正在使用JavaScriptSerializer.如果有办法使用JSON.Net做到这一点,我愿意切换到那个.
如何反序列化此JSON数据?键"100034"等本质上是动态的.
{
"users" : {
"100034" : {
"name" : "tom",
"state" : "WA",
"id" : "cedf-c56f-18a4-4b1"
},
"10045" : {
"name" : "steve",
"state" : "NY",
"id" : "ebb2-92bf-3062-7774"
},
"12345" : {
"name" : "mike",
"state" : "MA",
"id" : "fb60-b34f-6dc8-aaf7"
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法可以直接访问每个具有名称,状态和ID的对象?
如何在JSON中正确描述列元数据,以后由Newtonsoft解析以构建ac#DataTable,这样我希望解决一个问题,即获取没有行的DataTable,但也没有列我需要列的列当我传递一个空表时,使用标签创建并希望使用数据类型.
标准输入的示例:
{
"BrokerID" : "998",
"AccountID" : "1313",
"Packages":[
{
"PackageID": 226,
"Amount": 15000,
"Auto_sync": true,
"Color": "BLUE"
},
{
"PackageID": 500,
"Amount": 15000,
"Auto_sync": true,
"Color": "PEACH"
}
]
}
Run Code Online (Sandbox Code Playgroud)
输入空表的示例:{"BrokerID":"998","AccountID":"1313","包":[]}
当我使用解析时, JsonConvert.DeserializeObject<DataTable>(params["Packages"]);我没有得到任何行,显然没有列,我正在寻找一种方法来描述json主体中的列元数据.
我有一棵树(带有复选框),如下所示。
A
A1
A11
A111(已选)
A112(已选)
A113
B11
B111(已选)
B112
我想过滤它以返回如下,因为A1是所选节点的公共父级
A1
A11
A111
A112
B11
B111
树是一个具有根节点及其子节点的层次结构:
public class Node
{
public int Id;
public string Name;
public Node Parent;
public List<Node> Children;
}
Run Code Online (Sandbox Code Playgroud)
基本上,这是 UI 中的树结构。根据用户选择的内容(复选框),我必须找到公共父级并显示结果树。
有什么解决方案可以以更好/更短的方式重构以下开关/案例代码?
property.Value 是一个 JTokenopportunity 是CRM Dynamics实体(类似于字典)我尝试了以下方法,但未成功(C#不可接受)
Type target = property.Value.Type.GetType();
opportunity[property.Key] = property.Value.Value<target>();
Run Code Online (Sandbox Code Playgroud)
这是我要简化的代码。(JTokenType.Object并且JTokenType.Array以其他方式处理。)
switch (property.Value.Type)
{
case JTokenType.Boolean:
opportunity[property.Key] = property.Value.Value<bool>();
break;
case JTokenType.Date:
opportunity[property.Key] = property.Value.Value<DateTime>();
break;
case JTokenType.Integer:
opportunity[property.Key] = property.Value.Value<int>();
break;
case JTokenType.String:
opportunity[property.Key] = property.Value.Value<string>();
break;
case JTokenType.Guid:
opportunity[property.Key] = property.Value.Value<Guid>();
break;
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过@diiN_的建议:
opportunity[property.Key] = property.Value.Value<dynamic>();
Run Code Online (Sandbox Code Playgroud)
给出以下JSON:
{
"Data": {
"SPECIAL": "QQ01",
"AA": "QQ",
"BB": "QQ",
"Data": [
{
"SPECIAL": "QQ02",
"AA": "QQ",
"BB": "QQ",
"CC": "QQ",
"Data": [
{
"SPECIAL": "QQ03",
"AA": "QQ",
"CC": "QQ",
"Data": [
{
"SPECIAL": "QQ04",
"AA": "QQ",
"CC": "QQ",
"Data": [
{
"SPECIAL": "QQ05",
"AA": "QQ",
"CC": "QQ",
"Data": [
{
"SPECIAL": "QQ06",
"AA": "QQ",
"CC": "QQ"
}
]
},
{
"SPECIAL": "QQ07",
"AA": "QQ",
"CC": "QQ",
"DD": "QQ",
"Data": [
{
"SPECIAL": "QQ08",
"AA": "QQ",
"CC": "QQ",
"Data": [ …Run Code Online (Sandbox Code Playgroud) 我有一个名称/值对的集合,它们用单词名称和值来定义,就像键/值对象一样,即
[{"Name":"ActivityId","DataType":1,"Value":"a7868f8c-07ac-488d-a414-714527c2e76f"},
{"Name":"Address1","DataType":2,"Value":"123 Main St"}]
Run Code Online (Sandbox Code Playgroud)
如果我有一个像这样的对象:
class Request
{
public Guid ActivityId { get; set; }
public string Address1 {get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何将其反序列化为上面的类?
我应该考虑使用自定义转换器吗?Json.NET 有内置的东西吗?有没有办法用我缺少的属性来装饰属性?自定义序列化会更容易吗?
我试图避免从字典中提取每个属性的数据,这将是一种简单的方法,但需要我对每个自定义实现都这样做。我更喜欢使用 Json.NET(或 .NET 框架中的某些内容)在单一方法中的基类中执行此操作。
我已经搜索了很多,大多数示例都是真实的名称/值对,没有以名称和值作为前缀,即
[{"ActivityId":"a7868f8c-07ac-488d-a414-714527c2e76f"}]
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我想支持使用Newtonsoft Json反序列化器反序列化多个自定义DateTime格式,因此我正在使用IsoDateTimeConverter:
var serializeSettings = new JsonSerializerSettings();
serializeSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "yyyyMMddTHHmmssZ" });
Run Code Online (Sandbox Code Playgroud)
由于该DateTimeFormat属性不接受格式数组,因此我尝试了以下方法来支持多种自定义日期格式:
var serializeSettings = new JsonSerializerSettings();
serializeSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "yyyyMMddTHHmmssZ" });
serializeSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-ddTHH:mm" });
Run Code Online (Sandbox Code Playgroud)
但是,以上代码的结果仅支持反序列化第一种格式。
如何实现对多种自定义DateTime格式的支持?
我试图以这样的 JSON 结束:
{"KIBANA_INDEX":"whatever"}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用JsonPropertyAttribute这样的:
[JsonProperty(PropertyName ="KIBANA_INDEX")]
public string KibanaIndex{ get; set; }
Run Code Online (Sandbox Code Playgroud)
我最终得到这样的 JSON:
{"kibanA_INDEX":"whatever"}
Run Code Online (Sandbox Code Playgroud)
有什么办法可以让 Newtonsoft.Json 屈服于我的意愿吗?