Tag: json.net

使用Json.Net序列化对象会导致Out of Memoryexception

免责声明:我确实完成了这里提供的大部分解决方案,但大部分都是在反序列化时讨论OOMexception。 我正在尝试使用Json.Net将对象(它是一个树)序列化为Json。 一切都适用于小对象但我在尝试使用大对象时会出现OOMexception。 由于它适用于相同数据类型的较小对象,我假设没有循环引用(我确实检查了我的数据结构)。 有没有办法我可以将我的对象转换为流(这是一个Windowsapp store应用程序)并使用该流生成Json? public static async Task SerializeIntoJson(string fileName, StorageFolder destinationFolder, Content content) { ITraceWriter traceWriter = new MemoryTraceWriter(); try { string jsonString = JsonConvert.SerializeObject(content, Formatting.Indented, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects, TypeNameHandling = TypeNameHandling.All, Error = ReportJsonErrors, TraceWriter = traceWriter, StringEscapeHandling = StringEscapeHandling.EscapeNonAscii }); System.Diagnostics.Debug.WriteLine(traceWriter); StorageFile file = await destinationFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); […]

如何反序列化其中包含无效字段名称的JSON对象

我有一个JSON请求,其结构如下: “formats”: { “flash_embed”: “http://a3.vikiassets.com/assets/vikiplayer-922746a667cfd38137a7e45df6ba1b95.swf?auto_play=true&language_codes=en&media_id=74965&partner=16&source=api_v3”, “m3u8”: “http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965/ios.m3u8”, “res-150p”: “http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965_mp4cell_150.mp4”, “res-240p”: “http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965_240p.mp4”, “res-270p”: “http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965_270p.mp4”, “res-360p”: “http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965_360p.mp4”, “res-480p”: “http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965_480p.mp4”, “res-720p”: “http://wpc.354a.edgecastcdn.net/00354A/videos/encoded/74965_720p.mp4” } } 现在res-150p,在C#中说无效名称,如果我给它另一个名字,那么在去手化时我没有得到任何值,在res-150p内是null。 编辑: [Serializable] MoviesListRootObject是包含Response然后Response包含Formats的根对象 public class MoviesListRootObject { public int count { get; set; } public Pagination pagination { get; set; } public List response { get; set; } } [Serializable] public class Response […]

覆盖Json.Net中的默认原始类型处理

有没有办法在处理原始类型时覆盖Json.net的默认反序列化行为? 例如,当将json数组[3.14,10,”test”]反序列[3.14,10,”test”]某种类型的object[] 3.14将为double类型, 10将为long类型。 无论如何我可以截取或覆盖这种类型的决定,所以我可以分别将值反序列化为decimal和int ? 我基本上总是希望json整数总是作为int返回并且浮点数以decimal返回。 这将节省我一些必须在我的代码中注入double到decimal转换。 我已经考虑扩展Newtonsoft.Json.Serialization.DefaultContractResolver并实现我自己的Newtonsoft.Json.JsonConverter但我还没有找到任何方法来实现这个所需的覆盖。 要重现的示例代码 object[] variousTypes = new object[] {3.14m, 10, “test”}; string jsonString = JsonConvert.SerializeObject(variousTypes); object[] asObjectArray = JsonConvert.DeserializeObject(jsonString); // Contains object {double}, object {long}, object {string}

每种类型自定义Json.NET序列化程序设置

我正在使用ApiController,它使用全局HttpConfiguration类来指定JsonFormatter设置。 我可以非常容易地全局设置序列化设置: config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects; 问题是并非所有设置都适用于我的项目中的所有类型。 我想为执行多态序列化的特定类型指定自定义TypeNameHandling和Binder选项。 如何在per-type上指定JsonFormatter.SerializationSettings,或者至少在per-ApiController上指定?

如何使Json.Net跳过空集合的序列化

我有一个对象,其中包含几个属性,这些属性是字符串List或字符串Dictionary 。 我想使用Json.net将对象序列化为json,我希望生成最少量的文本。 我使用DefaultValueHandling和NullValueHandling将默认值设置为字符串和整数。 但是,如果将DefaultValueHandling初始化为空List或Dictionary我如何定义DefaultValueHandling以忽略序列化输出中的属性? 一些示例输出是: { “Value1”: “my value”, “Value2”: 3, “List1”: [], “List2”: [] } 我想得到一个忽略上例中两个列表的结果,因为它们被设置为空列表的默认值。 任何帮助将不胜感激

如何使用JSON.NET反序列化日期(毫秒)?

我正在处理如下响应: {“id”:”https://login.salesforce.com/id/00Dx0000000BV7z/005x00000012Q9P”, “issued_at”:”1278448832702″,”instance_url”:”https://na1.salesforce.com”, “signature”:”0CmxinZir53Yex7nE0TD+zMpvIWYGb/bdJh6XfOH6EQ=”,”access_token”: “00Dx0000000BV7z!AR8AQAxo9UfVkh8AlV0Gomt9Czx9LjHnSSpwBMmbRcgKFmxOtvxjTrKW1 9ye6PE3Ds1eQz3z8jr3W7_VbWmEu4Q8TVGSTHxs”} 我正在尝试将其反序列化为类似于以下内容的类: public class TokenResponse { public string Id { get; set; } [JsonProperty(PropertyName = “issued_at”)] public DateTime IssuedAt { get; set; } public string Signature { get; set; } [JsonProperty(PropertyName = “instance_url”)] public string InstanceUrl { get; set; } [JsonProperty(PropertyName = “access_token”)] public string AccessToken { get; set; } […]

多个JsonProperty名称分配给单个属性

我有两种格式的JSON,我想反序列化为一个类。 我知道我们不能将两个[JsonProperty]属性应用于一个属性。 能告诉我一个实现这个目标的方法吗? string json1 = @” { ‘field1’: ‘123456789012345’, ‘specifications’: { ‘name1’: ‘HFE’ } }”; string json2 = @” { ‘field1’: ‘123456789012345’, ‘specifications’: { ‘name2’: ‘HFE’ } }”; public class Specifications { [JsonProperty(“name1”)] public string CodeModel { get; set; } } public class ClassToDeserialize { [JsonProperty(“field1”)] public string Vin { get; set; } [JsonProperty(“specification”)] […]

使用JSON.NET将属性反序列化为ExpandoObject

例如,有一个像下一个的对象: public class Container { public object Data { get; set; } } 它以这种方式使用: Container container = new Container { Data = new Dictionary { { “Text”, “Hello world” } } }; 如果我反序列化从序列化上面的实例获得的JSON字符串, Data属性,即使我提供ExpandoObjectConverter ,它也不会反序列化为ExpandoObject : Container container = JsonConvert.Deserialize(jsonText, new ExpandoObjectConverter()); 如何反序列化使用匿名对象分配的类属性,或者至少不是具体类型作为ExpandoObject ? 编辑: 有人回答说我可以使用动态对象。 这对我不起作用。 我知道我可以这样做,但事实并非如此,因为我需要一个ExpandoObject。 谢谢。 编辑2: 其他一些用户回答我可以将JSON字符串反序列化为ExpandoObject 。 这不是这个问题的目标。 我需要反序列化具有动态属性的具体类型。 在JSON字符串中,此属性可以是关联数组。

Json.NET,如何自定义序列化以插入JSON属性

我一直无法找到JsonConvert.WriteJson的合理实现,它允许我在序列化特定类型时插入JSON属性。 我的所有尝试都导致“JsonSerializationException:使用类型XXX检测到自引用循环”。 关于我正在尝试解决的问题的更多背景:我使用JSON作为配置文件格式,并且我使用JsonConverter来控制我的配置类型的类型解析,序列化和反序列化。 我不想使用$type属性,而是想使用更有意义的JSON值来解析正确的类型。 在我的简化示例中,这里有一些JSON文本: { “Target”: “B”, “Id”: “foo” } 其中JSON属性”Target”: “B”用于确定此对象应序列化为B 。 考虑到这个简单的例子,这种设计似乎并不那么引人注目,但它确实使配置文件格式更加有用。 我还希望配置文件是可循环访问的。 我有反序列化的工作,我无法工作的是序列化案例。 我的问题的根源是我找不到使用标准JSON序列化逻辑的JsonConverter.WriteJson的实现,并且不会抛出“自引用循环”exception。 这是我的实现: public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { JProperty typeHintProperty = TypeHintPropertyForType(value.GetType()); //BUG: JsonSerializationException : Self referencing loop detected with type ‘B’. Path ”. // Same error occurs whether I use the serializer parameter […]

如何使用JSON.NET保存带有四个空格缩进的JSON文件?

我需要读取JSON配置文件,修改值,然后再次将修改后的JSON保存回文件。 JSON就像它获得的一样简单: { “test”: “init”, “revision”: 0 } 要加载数据并修改值,我这样做: var config = JObject.Parse(File.ReadAllText(“config.json”)); config[“revision”] = 1; 到现在为止还挺好; 现在,将JSON写回文件。 首先我尝试了这个: File.WriteAllText(“config.json”, config.ToString(Formatting.Indented)); 哪个正确写入文件,但缩进只有两个空格。 { “test”: “init”, “revision”: 1 } 从文档IndentChar ,似乎没有办法以这种方式传递任何其他选项,所以我尝试修改这个例子 ,这将允许我直接设置IndentChar的Indentation和IndentChar属性来指定缩进量: using (FileStream fs = File.Open(“config.json”, FileMode.OpenOrCreate)) { using (StreamWriter sw = new StreamWriter(fs)) { using (JsonTextWriter jw = new JsonTextWriter(sw)) { jw.Formatting = Formatting.Indented; […]