Tag: json.net

忽略Json.NET序列化中的基类属性

我有以下类结构: [JsonObject] public class Polygon : IEnumerable { public List Vertices { get; set; } public AxisAlignedRectangle Envelope { get; set; } } public class AxisAlignedRectangle : Polygon { public double Left { get; set; } … } 我正在序列化Polygon类,但是当我这样做时,我得到一个JsonSerializationException ,消息“为属性’Envelope’检测到自引用循环’,类型为’MyNamespace.AxisAlignedRectangle’。” 如果我将[JsonObject(IsReference = true)] ( 如此处所述 )添加到AxisAlignedRectangle,代码运行正常,但我在每个AxisAlignedRectangle实例中得到一个自动分配的$ id字段,并在该实例重新启动时得到一个$ ref字段参考的。 例如,当我序列化多边形时,我得到: { Vertices: [ … ], Envelope: […]

如何让newtonsoft反序列化yes和no to boolean

注意:我已在此Feed的底部提供了解决方案。 我有一个C#Win 8应用程序,我正在对一些看起来像这样的json进行反序列化: { ‘Unit’: [ { ‘name’:’House 123′, isAvailable:’no’ }, { ‘name’:’House 456′, isAvailable:’yes’ }] } 进入使用此接口的类: public interface IUnit { string Name { get; } bool isAvailable { get; } } 但是牛顿软件引发了一个错误: 解析值时遇到意外的字符:n。 路径’单位[0] .isAvailable,第1行,第42位。 有没有办法根据生成的对象属性类型bool扩展Newtonsoft来解析yes / no或1/0? 现在它只适用于真/假。 类的自定义转换器上有几个post,但不是像bool这样的原始类型。 有什么建议?

如何反序列化JSONP响应(最好使用JsonTextReader而不是字符串)?

我正在尝试使用声称返回JSON的Web服务,但实际上总是返回JSONP。 我没有看到改变该服务行为的方法。 我想用NewtonSoft Json.Net来解析结果。 我已经声明了一个类,我们将其称为MyType,我希望将内部JSON结果反序列化为。 JSONP: parseResponse({ “total” : “13,769”, “lower” : “1”, “upper” : “20”}) 正如您所看到的,这不是正确的JSON,因为它具有parseResponse(前缀和)后缀。 虽然这个例子非常简单,但实际响应可能很长,大约为100K。 我的风格: public class MyType { public Decimal total; public int lower; public int upper; } 在我将Web服务响应转换为流和JsonTextReader之后,我尝试反序列化,如下所示: (MyType)serializer.Deserialize(jsonTextReader, typeof(MyType)); 当然,我得到一个结果为null,因为有圆括号的那个讨厌的parseResponse。 我已经看过这个问题 ,遗憾的是没有帮助。 我实际上是使用JsonTextReader来输入JSON,而不是字符串(并且更喜欢这样以避免创建巨大字符串的性能)。 即使我使用该问题的建议,它看起来很危险,因为它使用全局替换。 如果没有好的方法来使用流,那么安全解析字符串的答案就可以了。

在没有属性的类上全局使用JsonConverter

我有一个MVC .net项目,我正在使用mongodb。 我使用自定义JsonConverter将ObjectId属性序列化为字符串,正如我在这个答案中描述的那样: 在MVC中自动将mongodb ObjectId作为字符串与Json.NET一起重新编写 在那里我使用了一个属性,以便自定义转换器用于某个属性: [JsonConverter(typeof(ObjectIdConverter)) 有没有办法告诉序列化器在ObjectId类型的所有属性上使用ObjectIdConverter? 我不想继续讨论整个项目并添加这个属性。 谢谢!

访问名称中带点的属性

我试图反序列化JSON。 我的根对象有一个属性“en.pickthall”。 我使用动态类型来读取我的JSON。 我以为我可以放弃“。” 在属性中,因为它是一个本地JSON文件,但是必须有一些方法来访问这样的属性 var result = App_Code.FileIOHelper.ReadFromDefaultFile(“ms-appx:///Assets/en.pickthall.json”); dynamic stuff = JsonConvert.DeserializeObject(result); foreach(var x in stuff.(en.pickthall)) //Tried this intellisense didn’t like it { }

外部json因为Json.Net TypeNameHandling auto而易受攻击?

我正在运营一个小型网站,用户可以上传JSON中定义的自定义“对象”。 最近我了解了使用JSON进行自动类型反序列化的可能威胁: JSON问题 。 我想我理解了问题,但我必须要求确定。 如果我只使用给定的特定类型(此处为MyObject )反序列化传入的JSON,则JsonConvert.DeserializeObject(json, settings); MyObject没有任何类型, MyObject的任何成员的子类型都没有System.Object或dynamic类型,没有什么可以变坏,对吧? settings TypeNameHandling settings为TypeNameHandling.Auto (让我们不要质疑这个决定它可能适用于None ,但是我想理解它设置为Auto的问题。) 编辑:更多信息:我已经测试了前面提到的网站中的JSON: { “obj”: { “$type”: “System.IO.FileInfo, System.IO.FileSystem”, “fileName”: “rce-test.txt”, “IsReadOnly”: true } } 如果MyObject具有System.Object或dynamic类型字段obj我可以重现威胁。 但是我想知道的是:即使MyObject是一个非常复杂的对象,有很多(派生的)子对象,但是它们中没有一个是或者有一个System.Object或一个动态字段(也不像List )? 例如,我可以想象Json.NET会因为$type信息而创建对象,即使MyObject没有相应的字段也可以找到。

如何在Json.net中强制最小小数位?

当我使用json.net向json写小数时,我会遇到恼人的不一致。 有时它达到1 dp,有时则达到2 dp。 显然我知道将小数字输出到具有一定数量小数的字符串的解决方案,例如,但是如果没有编写自定义序列化器,你没有使用json.net进行控制。 我也知道Math.Round强制执行最大小数位数,这个问题涉及强制执行最小小数位数。 前两个测试显示正在发生的事情,它保留声明或计算中的原始小数位数。 我发现我可以添加然后减去接下来两个测试显示有效的一小部分,但是有更清洁的方法吗? [TestFixture] public sealed class DecimalPlaces { public class JsonType { public decimal Value { get; set; } } [Test] public void TwoDp() { var obj = new JsonType { Value = 1.00m }; Assert.AreEqual(“{\”Value\”:1.00}”, JsonConvert.SerializeObject(obj)); } [Test] public void OneDp() { var json = new JsonType { […]

使用Json.net – ac#object的部分自定义序列化

我使用Newtonsofts的Json.Net将一些对象数组序列化为json。 对象具有一组共同的属性,但也具有Meta属性,这是一个字典 在序列化期间,我希望将键值对添加到我的json对象,就像它们在根级别属性中一样,就像这样…… { id: 1, name:’jeff’, food:’spinch’, spoon: ‘ýes’ } 不是这样的: { id: 1, name:’jeff’, meta:{ food:’spinch’, spoon: ‘ýes’ } } 我已经挖了JsonSerializerSettings但似乎无法发现我可以跳进去并覆盖???

使用newtonsoft从Json字符串中删除属性

我有以下JSON字符串: { “results”:[ { “id”:11, “name”:”Employee A”, “isEmployee”:true }, { “id”:12, “name”:”Employee B”, “isEmployee”:true }, { “id”:13, “name”:”Employee C”, “isEmployee”:true }, { “id”:14, “name”:”Contractor A”, “isEmployee”:false }, { “id”:15, “name”:”Contractor B”, “isEmployee”:false } ], “totalItems”:5 } 我需要从中删除id和isEmployee属性,并只保留name属性。 这是期望的结果: { “results”:[ { “name”:”Employee A” }, { “name”:”Employee B” }, { “name”:”Employee C” }, { “name”:”Contractor A” […]

使用Json.net将大型数据列表作为JSON格式流式传输

使用MVC模型,我想编写一个JsonResult,它将Json字符串流式传输到客户端,而不是立即将所有数据转换为Json字符串,然后将其流回客户端。 我有动作需要发送非常大(超过300,000条记录)作为Json传输,我认为基本的JsonResult实现不可扩展。 我正在使用Json.net,我想知道是否有一种方法来流式传输Json字符串的块。 //Current implementation: response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(Data, formatting)); response.End(); //I know I can use the JsonSerializer instead Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer(); serializer.Serialize(textWriter, Data); 但是我不确定如何将块写入textWriter并写入响应并调用reponse.Flush()直到所有300,000条记录都转换为Json。 这有可能吗?