Tag: json.net

使用newtonsoft.json反序列化List

我正在尝试序列化和反序列化一个abstract类列表( mustinherit ),其中只有派生类的实例。 我用JsonProperty(ItemTypeNameHandling = TypeNameHandling.Auto)修饰了list参数,获得了如下所示的输出: 但是当我反序列化时,它一直说他不能反序列化抽象类。 http://james.newtonking.com/json/help/index.html?topic=html/SerializeTypeNameHandling.htm public class ConcreteClass { private ObservableCollection _Nodes = new ObservableCollection(); // public ObservableCollection Nodes { get { return this._Nodes; } } public string Name { get; set; } public int Id { get; set; } } public abstract class AbstractClass { private ObservableCollection _Nodes = new ObservableCollection(); […]

升级Json.NET后如何恢复int反序列化行为?

我有一些.NET代码反序列化由运行动态语言的webservice创建的JSON对象。 因为源是动态的,所以它有时会以float格式序列化整数值(例如2被序列化为“2.0”)。 使用Json.NET 4.0.4 ,这可以无缝地工作(似乎在反序列化时应用了舍入)。 但是,升级到Json.NET 4.5后,反序列化2.0现在会抛出FormatException 。 这是代码: // works as expected in both versions var s = “2”; Console.WriteLine(JsonConvert.DeserializeObject(s)); // throws FormatException in 4.5 only var s = “2.0”; Console.WriteLine(JsonConvert.DeserializeObject(s)); // throws FormatException in 4.5, rounds to 3 in 4.0.4 var s = “2.6”; Console.WriteLine(JsonConvert.DeserializeObject(s)); 有没有简单的方法来恢复原来的行为? 理想的行为是仅反序列化具有整数值的数字,但是以任何格式(例如2.0,1e10,但不是2.5),但我会满足于4.0.4行为。

使用Newtonsoft JSON.NET反序列化Dynamic Json字符串

我有一个JSON字符串,我从Facebook API获得,其中我有一个名称根据其内容而变化的节点,例如有些时间它是45,或58等。它可以是任何数字。 我想要它的价值。 怎么弄呢? 例: { “data”: [ { “id”: “1492292372_10201810786059989”, “created_time”: “2014-04-05T09:00:54+0000” }, { “id”: “1492292372_10201804679827337”, “created_time”: “2014-04-04T07:29:07+0000” }, { “id”: “1492292372_10201804649306574”, “created_time”: “2014-04-04T07:10:33+0000” }, { “id”: “1492292372_10201801316823264”, “created_time”: “2014-04-03T18:31:50+0000” }, { “id”: “1492292372_10201798962284402”, “created_time”: “2014-04-03T06:24:47+0000” }, { “message_tags”: { “0”: [ { “id”: “1492292372”, “name”: “Yawar Sohail”, “type”: “user”, “offset”: 0, “length”: 12 […]

如何仅对某些属性应用缩进序列化?

我希望以人类可读的方式将.NET对象序列化为JSON,但我希望能够更好地控制对象的属性或数组的元素是否最终在自己的行上。 目前我正在使用JSON.NET的JsonConvert.SerializeObject(object, Formatting, JsonSerializerSettings)方法进行序列化,但似乎我只能应用Formatting.Indented (单个行上的所有元素)或Formatting.None (一行上的所有内容)没有任何空格)整个对象的全局格式规则。 有没有办法在默认情况下全局使用缩进,但是为某些类或属性关闭它,例如使用属性或其他参数? 为了帮助您理解该问题,以下是一些输出示例。 使用Formatting.None : {“array”:[“element 1″,”element 2″,”element 3″],”object”:{“property1″:”value1″,”property2″:”value2”}} 使用Formatting.Indented : { “array”: [ “element 1”, “element 2”, “element 3” ], “object”: { “property1”: “value1”, “property2″:”value2” } } 我想看到的: { “array”: [“element 1″,”element 2″,”element 3”], “object”: {“property1″:”value1″,”property2″:”value2”} } (我意识到我的问题可能与这个问题有点相关,但那里的评论完全忽略了这一点,并没有真正提供有效答案。)

比较两个相同结构的任意JToken-s

提前致谢。 我感谢任何帮助。 我想比较两个相同类型和结构的任意JTokens(来自NewtonSoft的Json.Net)。 static int CompareTokens(JToken x, JToken y); // possible output: 0 / 1 / -1 主要目标是能够使用此方法对两个Json字符串进行排序,这样即使在开始时它们具有相同的数据,但是顺序不同,最后这两个字符串完全相同。 所以排序标准并不重要,重要的是这个标准总是相同的。 并且应该考虑每个小数据元素。 JToken可以是以下几种类型之一: Array, Boolean, Date, Float, Guid, Integer, Null, Object, Property, String, TimeSpan, Uri 。 我没有考虑比较Bytes, Comment, Constructor, None, Undefined, Raw 。 获得一些关于比较JArrays和JObjects的想法会很棒 。 这应该是一些递归比较,因为JArrays可能包含其他JArrays和JObject ,反之亦然。 任何想法将不胜感激。 但是,了解比较更简单的类型也会非常有帮助。 我想知道如何从JToken转换为实际类型(而不是知道如何在逻辑上进行)。 JValue已实现IComparable ,但我没有弄清楚如何将简单类型的JToken转换为JValue 。 了解这一点也会有所帮助。 这是一个很常见的问题。 如果我弄清楚如何做到这一点,我会在上面放一个+100。 抱歉我的英语。

c#JSON序列化使用值而不是属性名称

我正在开发一个JSON驱动的项目,我想为SessionManager对象提供一个动态的权限列表。 虽然我可以使用一组键值对进行权限,但我想知道是否可以删除属性名称,以便键是Permission值, 值是IsAllowed值。 public class SessionPermission { public string Permission { get; set; } public bool IsAllowed { get; set; } } public class SessionManager { public string UserName { get; set; } public string Password { get; set; } public List Permissions { get; set; } public void SetPermissions() { Permissions = new List […]

如何使用Json.NET StringEscapeHandling.EscapeNonAscii

可能重复: 将StringEscapeHandling.EscapeNonAscii与Json.NET一起使用 最新版本的Json.NET(4.5.11)包含StringEscapeHandling.EscapeNonAscii ,它可以转义所有非ASCII字符。 但是,我无法弄清楚如何使用它。 这些文档似乎没有我能找到的任何示例(仅发布一个发布说明)。 有人可以使用EscapeNonAscii显示将对象序列化为JSON字符串的EscapeNonAscii吗?

使用ReferenceLoopHandling.Ignore序列化循环相关的ISerializable对象时抛出StackOverflowException

我有一个遗留应用程序,它使用二进制序列化来保存数据。 现在我们想使用Json.net 4.5来序列化数据,而不需要对现有类进行太多更改。 事情很顺利,直到我们打了一个循环的依赖类。 有没有解决这个问题的解决方法? 示例代码如下所示 [Serializable] class Department : ISerializable { public Employee Manager { get; set; } public string Name { get; set; } public Department() { } public Department( SerializationInfo info, StreamingContext context ) { Manager = ( Employee )info.GetValue( “Manager”, typeof( Employee ) ); Name = ( string )info.GetValue( “Name”, typeof( […]

使用JSON.Net进行JObject和CamelCase转换

如何将通用JObject转换为camelCase普通json字符串? 我尝试过使用JsonSerializerSettings但不起作用(Newtonsoft.Json 4.5.11) [Test] public void should_convert_to_camel_case() { var serializer = JsonSerializer.Create(new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }); var jo = new JObject(); jo[“CamelCase”] = 1; var stringWriter = new StringWriter(); var writer = new JsonTextWriter(stringWriter); serializer.Serialize(writer,jo); var serialized = stringWriter.ToString(); Assert.AreEqual(“{\”camelCase\”:1}”, serialized); } 更新根据http://json.codeplex.com/workitem/23853无法完成(tnx到@nick_w的链接)

JSON.Net:在不指定程序集的情况下反序列化多态类型

我看到使用JSON.Net,如果$type属性指定JSON对象的特定类型,我可以解码多态对象。 在我看到的所有示例中, $type包含命名空间。 是否可以使这个工作包括一个简单的类型名称而不需要汇编? 如果可能的话,我很乐意为JsonSerializer指定一个默认程序集。 我可以使用以下命令反序列化JSON: public class SingleAssemblyJsonTypeBinder : SerializationBinder { private readonly Assembly _assembly; private Dictionary _typesBySimpleName = new Dictionary(StringComparer.OrdinalIgnoreCase); private Dictionary _simpleNameByType = new Dictionary(); public SingleAssemblyJsonTypeBinder(Assembly assembly) { _assembly = assembly; _typesBySimpleName = new Dictionary(); foreach (var type in _assembly.GetTypes().Where(t => t.IsPublic)) { if (_typesBySimpleName.ContainsKey(type.Name)) throw new InvalidOperationException(“Cannot user PolymorphicBinder on […]