Tag: json.net

在返回客户端之前修改JSON的通用方法

我正在使用一个通用方法,它允许我修改返回给客户端的对象的JSON,特别是删除返回对象中的某些属性。 与此处的建议相似。 这些修改是非确定性的,因为它们是根据与用户相关的规则按请求确定的。 所以这不适合缓存的方法。 我已经回顾了几种方法。 最明显的选择是JsonConverter,但是这里存在问题,如此处和此处所列。 这种方法的主要问题是调用JToken.FromObject中的WriteJson来获取特定值的JSON,递归调用相同的JsonConverter,从而产生循环。 我已经尝试了此处列出的解决方案的变体,它提供了一种暂时禁用CanWrite以防止循环问题的方法。 但是,它似乎不适用于多个并发请求。 JsonConverter的单个实例在多个线程之间共享,这些线程在不同时间更改和读取CanWrite属性的状态,从而导致不一致的结果。 我也尝试在WriteJson使用不同的序列化WriteJson (即除了提供给该方法的序列化WriteJson之外)但是这不支持递归(因为该序列化程序不使用我的JsonConverter)所以任何嵌套项目都不会由我处理JsonConverter。 从默认的序列化程序的转换器集合中删除我的JsonConverter也存在同样的问题。 基本上,如果我想能够递归处理我的模型对象,我将得到自引用循环问题。 理想情况下, JToken.FromObject有一些方法可以选择性地不在对象本身上调用JsonConverter,但仍然在序列化期间将它应用于任何子对象。 只有在传递给CanConvert的对象与传递给CanConvert的最后一个对象的类型不同时,我才通过修改CanConvert将CanWrite设置为true来解决这个WriteJson 。 但是为了实现这一点,我需要一个每请求范围的JsonConverter(由于上面相同的线程原因),但我看不出如何得到它。 以下是我的样本: – using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Test { public class TestConverter : JsonConverter { bool CannotWrite { get; set; } public override bool […]

Json.net全局设置

有没有办法为Json.net指定全局设置? 我们遇到的问题是它将所有DateTimes都置于UTC(正确地说是这样)。 出于传统目的,我们希望默认为本地时间。 我不想在下面放置以下代码: var settings = New JsonSerializerSettings(); settings.DateTimeZoneHandling = DateTimeZoneHandling.Local; JsonConvert.DeserializeObject(json, settings);

使用无效键值访问JArray值:“fields”。 预期数组位置索引

我正在使用监护人API来尝试和检索故事但仍然收到exception。 json的字符串包含下面的json,但是我无法使用LINQ访问正文。 这里是: { “response”:{ “status”:”ok”, “userTier”:”approved”, “total”:1, “startIndex”:1, “pageSize”:10, “currentPage”:1, “pages”:1, “orderBy”:”newest”, “results”:[{ “id”:”sustainable-business/sustainable-finance-where-next-open-thread”, “sectionId”:”sustainable-business”, “sectionName”:”Guardian Sustainable Business”, “webPublicationDate”:”2014-02-13T13:27:00Z”, “webTitle”:”Where next for sustainable finance? – open thread”, “webUrl”:”http://www.theguardian.com/sustainable-business/sustainable-finance-where-next-open-thread”, “apiUrl”:”http://content.guardianapis.com/sustainable-business/sustainable-finance-where-next-open-thread”, “fields”:{ “body”:”…” } }] } } 我尝试过包括这个在内的所有事情: string story = (string)ja[“response”][“results”][“fields”][“body”]; 更新: public partial class Story : PhoneApplicationPage { string url; string jsonData; // Http […]

Json.Net在列表反序列化期间调用属性getter,导致重复项

我正在使用json.net来实现winform应用程序的memento模式 。 我正在使用memento在失败的数据库事务上回滚对象。 我得到的问题是,当反序列化纪念品时,调用getter而不是setter。 让我来certificate一下: class MyClass { public int ID { get; set; } public string field1 { get; set; } public string field2 { get; set; } private List _someObjects; public List SomeObjects { get { if(_someObjects == null) { _someObjects = LoadSomeObjectsFromDB(); } return _someObjects; } set { _someObjects = value; } […]

在序列化为JSON时获取OutOfMemoryException?

我正在序列化,一个MultiDictionary http://powercollections.codeplex.com/给json。 它有618个元素,其元素是深层嵌套的,即单个Object可能有几个类似于字典的对象。 我正在使用JSON.Net String json = JsonConvert.SerializeObject(json, Newtonsoft.Json.Formatting.Indented); 我错过了什么? 更多信息: – 这工作正常,直到我使用动态,我不得不切换到MultiDictionary允许同名的多个属性。 它适用于大多数情况,只有当项目数量很大时才会中断。 更新: – 我已经能够控制内存消耗,但减少了一些递归添加到每个元素的元素。

使用JSON.NET库在JArray中查找节点(JObject)

我正在使用JSON.NET库。 我创建了几个JObject并将它们添加到JArray中。 JArray array = new JArray(); JObject obj = new JObject(); obj.Add(new JProperty(“text”, “One”)); obj.Add(new JProperty(“leaf”, false)); array.Add(obj); obj = new JObject(); obj.Add(new JProperty(“text”, “Two”)); obj.Add(new JProperty(“leaf”, false)); array.Add(obj); obj = new JObject(); obj.Add(new JProperty(“text”, “Three”)); obj.Add(new JProperty(“leaf”, true)); array.Add(obj); 现在我想找到一个JObject的文本(JProperty)是Two 。 如何使用JProperty在JArray中找到JObject。

如何为JObject创建唯一的哈希码?

我正在尝试为JObjects实现缓存。 我很惊讶地看到他们没有覆盖GetHashCode方法,因此我不能将它用作唯一键。 由于我的json非常大,我不想使用JObject.ToString().GetHashCode作为解决方案。 我确实看到他们有一个名为GetDeepHashCode的内部方法,但实现基于其他受保护的属性,因此,我无法“复制”代码并从中创建扩展方法。 我也不想使用reflection并调用内部GetDeepHashCode方法。 我正在寻找一种为JObject创建唯一缓存键的JObject ,我不希望这种方法在性能方面更加昂贵。

仅在一个对象时将XML转换为Json数组

我目前正在使用Newtonsoft将一些xml转换为json以从RestExtension返回。 我的xml是以。的forms name detail name detail 我把它转换为json使用 JsonConvert.SerializeXmlNode(xmldocument); 如果有多个项目,这可以正常工作。 我得到了这个 – json中的一个项目数组(这是我需要的): {“Items”:{“Item”:[{“Name”:”name”,”Detail”:”detail”},{“Name”:”name”,”Detail”:”detail”}]}} 但是当只有一个时,可以理解的是这样转换(不是数组): {“Items”:{“Item”:{“Name”:”name”,”Detail”:”detail”}}} 我正在阅读此内容的应用程序开发人员需要json返回一个项目数组,无论是否有一个或多个。 有没有办法欺骗它认为它是一个数组或者有人建议另一种方式这样做?

JSON.NET JObject键比较不区分大小写

我正在使用Newtonsoft Json.net来解析JSON字符串。 我将字符串转换为JObject。 当通过键访问元素的值时,我希望比较不区分大小写。 在下面的代码中,我使用“FROM”作为键。 我希望它在行json [“FROM”]返回字符串“1”.ToString()。 但它失败了。 是否可以使下面的代码工作? String ptString = “{from: 1, to: 3}”; var json = (JObject)JsonConvert.DeserializeObject(ptString); String f = json[“FROM”].ToString();

Json.net实现IEnumerable 的自定义集合的序列化

我有一个实现IEnumerable的集合类,我无法反序列化相同的序列化版本。 我正在使用Json.net v 4.0.2.13623 这是我的集合类的简化版本,它说明了我的问题 public class MyType { public int Number { get; private set; } public MyType(int number) { this.Number = number; } } public class MyTypes : IEnumerable { private readonly Dictionary c_index; public MyTypes(IEnumerable seed) { this.c_index = seed.ToDictionary(item => item.Number); } public IEnumerator GetEnumerator() { return this.c_index.Values.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() […]