相关疑难解决方法(0)

JSON.net:如何在不使用默认构造函数的情况下反序列化?

我有一个具有默认构造函数的类,也是一个带有一组参数的重载构造函数.这些参数与对象上的字段匹配,并在构造时分配.此时我需要默认构造函数用于其他目的,所以我想保留它,如果可以的话.

我的问题:如果我删除默认构造函数并传入JSON字符串,该对象将正确反序列化并传入构造函数参数而不会出现任何问题.我最终以我期望的方式取回填充的对象.但是,只要我将默认构造函数添加到对象中,当我调用JsonConvert.DeserializeObject<Result>(jsontext)属性时就不再填充了.

此时我尝试添加new JsonSerializerSettings(){CheckAdditionalContent = true}反序列化调用.那什么都没做.

另一个说明.除了参数以小写字母开头之外,构造函数参数确实与字段的名称完全匹配.我不认为这很重要因为,就像我提到的,反序列化工作正常,没有默认构造函数.

这是我的构造函数的示例:

public Result() { }

public Result(int? code, string format, Dictionary<string, string> details = null)
{
    Code = code ?? ERROR_CODE;
    Format = format;

    if (details == null)
        Details = new Dictionary<string, string>();
    else
        Details = details;
}
Run Code Online (Sandbox Code Playgroud)

c# json json.net

117
推荐指数
3
解决办法
9万
查看次数

如何使用JSON.net处理同一属性的单个项目和数组

我正在尝试修复我的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处理这个?

json.net sendgrid

82
推荐指数
3
解决办法
3万
查看次数

序列化词典时保留外壳

我有一个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)

c# json.net

80
推荐指数
3
解决办法
2万
查看次数

使用json.net反序列化没有类型信息的多态json类

Imgur api调用返回一个列表,其中包含json中表示的Gallery ImageGallery Album类.

我不知道如何使用Json.NET自动反序列化这些,因为没有$ type属性告诉反序列化器要表示哪个类.有一个名为"IsAlbum"的属性可用于区分两者.

这个问题似乎显示了一种方法,但它看起来有点像黑客.

我该如何反序列化这些类?(使用C#,Json.NET).

样本数据:

图库图片

{
    "id": "OUHDm",
    "title": "My most recent drawing. Spent over 100 hours.",
        ...
    "is_album": false
}
Run Code Online (Sandbox Code Playgroud)

画廊专辑

{
    "id": "lDRB2",
    "title": "Imgur Office",
    ...
    "is_album": true,
    "images_count": 3,
    "images": [
        {
            "id": "24nLu",
            ...
            "link": "http://i.imgur.com/24nLu.jpg"
        },
        {
            "id": "Ziz25",
            ...
            "link": "http://i.imgur.com/Ziz25.jpg"
        },
        {
            "id": "9tzW6",
            ...
            "link": "http://i.imgur.com/9tzW6.jpg"
        }
    ]
}
}
Run Code Online (Sandbox Code Playgroud)

}

c# serialization json.net imgur

66
推荐指数
2
解决办法
3万
查看次数

Web API从小写字母开始序列化属性

如何配置我的Web API的序列化以使用camelCase(从小写字母开始)属性名称而不是PascalCase像在C#中那样.

我可以为整个项目全球化吗?

.net c# asp.net-mvc json.net asp.net-web-api

52
推荐指数
2
解决办法
3万
查看次数

有没有办法在不使用JsonIgnore属性的情况下忽略Json.NET中的get-only属性?

有没有办法忽略使用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)

c# json json.net

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

将字典序列化为数组(键值对)

Json.Net通常将a序列Dictionary<k,v>化为集合;

"MyDict": {
  "Apples": {
    "Taste": 1341181398,
    "Title": "Granny Smith",
  },
  "Oranges": {
    "Taste": 9999999999,
    "Title": "Coxes Pippin",
  },
 }
Run Code Online (Sandbox Code Playgroud)

哪个好.从环顾四周看似乎是大多数人想要的东西.但是,在这种特殊情况下,我想在我的Dictionary<k,v>和Array格式之间进行序列化;

"MyDict": [
    "k": "Apples",
    "v": {
        "Taste": 1341181398,
        "Title": "Granny Smith",
    }
  },
    "k:": "Oranges",
    "v:": {
        "Taste": 9999999999,
        "Title": "Coxes Pippin",
    }
  },
]
Run Code Online (Sandbox Code Playgroud)

使用我现有的字段类型有一种简单的方法吗?有没有我可以注释的属性?

c# json.net

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

忽略在序列化为JSON时抛出异常的类成员

我正在使用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)

c# serialization json json.net

32
推荐指数
2
解决办法
2万
查看次数

Json.Net - 从'System.Net.IPAddress'上的'ScopeId'获取值时出错

我试图用Json.Net序列化IPEndpoint对象,我收到以下错误:

从'System.Net.IPAddress'上的'ScopeId'获取值时出错.

导致错误的原因是我只使用端点中IPAddress对象的IPV4属性.当Json解析器尝试解析IPv6部分时,它会访问ScopeID属性,该属性会抛出套接字异常"对于引用的对象类型,不支持尝试的操作"(null将足以支持microsoft!)

我想知道除了撕掉一切并将地址信息编码为字符串之外是否还有其他解决方法?在某些时候,我确实想支持IPV6.如果IPAddress系列设置为Internetwork而不是InternetworkIPV6,是否有任何可以在Json.NET中完成忽略错误或只是不尝试序列化ScopeID?

谢谢,

Dinsdale

.net c# system.net json.net

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

如何在序列化特定类型时使JSON.Net序列化程序调用ToString()?

我使用Newtonsoft.Json序列化程序将C#类转换为JSON.对于某些类,我不需要序列化程序将实例添加到单个属性,而只需要在对象上调用ToString,即

public class Person
{
   public string FirstName { get; set; }
   public string LastName { get; set; }

   public override string ToString() { return string.Format("{0} {1}", FirstName, LastName ); }
}
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能将Person对象序列化为ToString()方法的结果?我可能有很多像这样的类,所以我不想最终得到一个特定于Person类的序列化器,我希望有一个可以适用于任何classe(通过属性我猜).

c# serialization json tostring json.net

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