小编Bri*_*ers的帖子

为什么在使用DateTimeStyles.AssumeUniversal时,JsonConvert用DateTimeKind.Unspecified更改DateTimes的时间?

我正在构建一个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)

datetime json.net

5
推荐指数
1
解决办法
753
查看次数

序列化包含Dictionary的对象,使得Dictionary键/值作为包含对象的一部分呈现

我有一个课程如下:

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做到这一点,我愿意切换到那个.

c# serialization json dictionary json.net

4
推荐指数
1
解决办法
1万
查看次数

如何使用动态(数字)键名称反序列化子对象?

如何反序列化此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的对象?

c# json json.net

4
推荐指数
1
解决办法
3374
查看次数

如何在JSON中为空DataTable包含列元数据

如何在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主体中的列元数据.

c# datatable json json.net

4
推荐指数
1
解决办法
2523
查看次数

如何将树过滤到共同父级

我有一棵树(带有复选框),如下所示。

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 中的树结构。根据用户选择的内容(复选框),我必须找到公共父级并显示结果树。

c# algorithm

4
推荐指数
1
解决办法
1422
查看次数

如何基于JTokenType简化JToken的铸造

有什么解决方案可以以更好/更短的方式重构以下开关/案例代码?

  • property.Value 是一个 JToken
  • opportunity 是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)

但它抛出InvalidDataContractException: 视觉工作室例外

c# json.net

4
推荐指数
1
解决办法
3301
查看次数

Linq-To-JSON查询以在分层JSON结构中查找特定属性的兄弟节点

给出以下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)

c# linq json json.net

4
推荐指数
1
解决办法
566
查看次数

将名称/值对反序列化为对象

我有一个名称/值对的集合,它们用单词名称和值来定义,就像键/值对象一样,即

[{"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)

有任何想法吗?

c# json json.net

4
推荐指数
1
解决办法
1135
查看次数

使用Json.Net反序列化时支持多种自定义DateTime格式

我想支持使用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格式的支持?

c# datetime json.net

4
推荐指数
1
解决办法
1229
查看次数

如何让 Newtonsoft.Json 按照我想要的方式序列化属性名称

我试图以这样的 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 屈服于我的意愿吗?

.net json.net .net-5

4
推荐指数
1
解决办法
2232
查看次数

标签 统计

json.net ×9

c# ×8

json ×5

datetime ×2

.net ×1

.net-5 ×1

algorithm ×1

datatable ×1

dictionary ×1

linq ×1

serialization ×1