Tag: json.net

Web Api模型绑定和多态inheritance

我问是否有人知道是否有可能将一个inheritance自抽象类的具体类传递给Web Api。 例如: public abstract class A{ A(); } public class B : A{ } [POST(“api/Request/{a}”)] public class Request(A a) { } 目前我已经环顾四周,大多数解决方案似乎都说使用TypeNameHandling会起作用。 JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter(); jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto; 然而,事实并非如此。 我的模型也从控制台应用程序传递到webapi。 我已经读过,我可能能够反序列化json对象,在尝试了几次后,我认为这不会起作用。 我已经考虑过创建一个客户模型绑定器,但是我不想让我的应用程序变得更加复杂。 目前我inheritance了3个模型的抽象类,但将来可能会扩展它。 您可能会注意到添加自定义模型绑定器可能需要多个绑定器,除非有一种方法可以为所有类型的抽象类创建一个通用绑定器。 为了在我的控制台应用程序中进行扩展,我已经实例化了类b,然后将其传递给ObjectContent,然后发布到我的webapi item = B(); //serialize and post to web api MediaTypeFormatter formatter; JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter(); jsonFormatter.SerializerSettings.TypeNameHandling […]

JSON.NET使用Type参数反序列化为对象

我有以下问题,我无法解决: 我有不同的类,它们都实现了一个名为IProtocol的接口。 目前,它们被命名为SimpleProtocol , ParallelProtocol 。 我想坚持这些对象,所以我使用了JSON.NET,一切正常。 除非我试图反序列化它们,当我知道它们应该是什么类型时,它会完美地工作,例如: SimpleProtocol p = JsonConvert.DeserializeObject(myJsonData); 但是,我现在处于这样一种情况:我想加载JSON数据并获得IProtocol ,但这是可以理解的,JSON不允许这样做; 例如,这样的东西不起作用: IProtocol p1 = JsonConvert.DeserializeObject(myJsonData); // does not work IProtocol p2 = (IProtocol)JsonConvert.DeserializeObject(myJsonData); // also, does not work 所以,查找API我发现了这个方法签名: public static Object DeserializeObject( string value, Type type ) 看起来就像我需要的东西,所以通过在字符串中保存类型并检索它来尝试: // test Type protocolType = Type.GetType(“MyApp.Protocols.SimpleProtocol”); IProtocol p1 = JsonConvert.DeserializeObject(myJsonData, protocolType); 我得到一个错误,就是不可能将Newtonsoft.Json.Linq.JObject […]

Json.NET Dictionary with StringComparer序列化

我有一个字典Dictionary<string, Dictionary> 。 外部字典和内部字典都有一个相等比较器集(在我的例子中是StringComparer.OrdinalIgnoreCase )。 字典序列化和反序列化后,两个字典的比较器都未设置为StringComparer.OrdinalIgnoreCase 。 如果您可以控制代码中字典的创建,则可以创建从字典inheritance的类,并在类的默认构造函数中设置comparer。 但是,如果您无法控制字典创建并从其他代码获取字典,该怎么办? 有没有办法用比较器正确序列化/反序列化?

使用json.net大小限制序列化数据?

我开发了一个asp.net Web应用程序,最初使用内置的javascript序列化程序将一些数据序列化为json字符串。 这成了问题,因为我后来发现有一个关于我能够序列化的数据量的问题。 在使用JSON JavaScriptSerializer进行序列化或反序列化期间,我一直收到“”错误。 字符串的长度超过了maxJsonLength属性上设置的值“。通过使用json.net序列化/反序列化我的数据很快就解决了这个问题。这意味着使用json.net序列化/反序列化时没有预设的最大大小或者有一个限制高于javascriptserializer使用的限制。 我的问题很简单。 在使用json.net进行序列化/反序列化时,我将来会遇到类似的问题吗? 即使用json.net序列化数据时是否有大小限制,或者我可以假设没有限制,我的程序应该没问题,因为数据库的大小增加了? 我在json.net的讨论论坛上问了这个问题,但没有收到回复。 我希望有人知道答案。 提前致谢。

避免在域模型中使用JsonIgnore属性

我有一个包含多个实体类的域模型组件。 在另一个组件中,我使用Json.NET序列化实现了实体存储库。 我希望在序列化期间忽略一些实体属性,因此直接的解决方案是使用JsonIgnore属性修饰这些属性。 但是,在原则上,我想避免在我的域模型中引用其他组件 – 包括第三方库,如Json.NET。 我知道我可以创建一个自定义合同解析器,如此处所述,但很难概括在各种实体中序列化和不序列化的内容。 通常我想忽略所有只读属性,但是例如集合有例外: public List Pixels { get { return this.Pixels; } } 我也可以为这里描述的每个实体创建一个专用的合同解析器,但对我来说这似乎是一个高维护的解决方案 – 特别是对于众多实体。 理想的解决方案是,如果Json.NET支持.NET框架中的某些属性,但我甚至找不到合适的候选者…… 我考虑在我的域模型中创建自己的自定义Ignore属性,并制作一个自定义契约解析器,它使用reflection来检测此属性,并在序列化时忽略修饰的属性。 但这真的是给定问题的最佳解决方案吗?

JSON.NET:将json string属性序列化为json对象

有可能告诉JSON.NET我有一个带有JSON数据的字符串吗? 我有一个这样的课: public class Foo { public int Id; public string RawData; } 我用的是这样的: var foo = new Foo(); foo.Id = 5; foo.RawData = @”{“”bar””:42}”; 我希望像这样序列化: {“Id”:5,”RawData”:{“bar”:42}} 基本上我有一块非结构化的可变长度数据已经存储为JSON,我需要完全序列化的对象来包含这些数据作为一部分。 谢谢。 编辑:只是为了确保它被正确理解,这是单向序列化,即我不需要它反序列化回同一个对象; 另一个系统应处理此输出。 我需要将RawData的内容作为JSON的一部分,而不仅仅是字符串。

序列化我的实体时Json.Net意外字符(“\”)

我正在使用优秀的Json.Net库来序列化由entity framework生成的实体。 我使用以下代码来执行此操作: using (MyVoucherEntities context = new MyVoucherEntities()) { List list = context.MyObjects.ToList(); string json = JsonConvert.SerializeObject(list); } 一切顺利我的意思是,对象被正确序列化除了一个人认为:它添加了转义字符“\”,这使得我在客户端进行反序列化时会遇到噩梦。 [ { \”$id\”: \”1\”, \”CreationDate\”: \”\\\/Date(1293186324257+0000)\\\/\”, \”ImageUrl\”: \”http:\/\/www.google.com\”, \”Title\”: \”Here is a title\” } ] 有谁知道为什么以及如何摆脱这些转义字符斜杠“\”?

如何为JSON.NET序列化添加时区偏移量?

我的DateTimePicker绑定到属​​性: picker.DataBindings.Add(“Value”, this, “EventDate”); … private DateTime eventDate; public DateTime EventDate { get { var offset = TimeZoneInfo.Local.GetUtcOffset(eventDate); string json = JsonConvert.SerializeObject(eventDate, Formatting.Indented); Console.WriteLine(“get: {0} — {1}”, json, offset); return eventDate; } set { var offset = TimeZoneInfo.Local.GetUtcOffset(value); string json = JsonConvert.SerializeObject(value, Formatting.Indented); Console.WriteLine(“set: {0} — {1}”, json, offset); eventDate = value; } } 每当数据绑定设置属性时,我得到以下结果: […]

使用Json.net仅将接口属性序列化为JSON

使用像这样的简单类/接口 public interface IThing { string Name { get; set; } } public class Thing : IThing { public int Id { get; set; } public string Name { get; set; } } 如何只使用“Name”属性(仅底层接口的属性)获取JSON字符串? 实际上,当我做到这一点时: var serialized = JsonConvert.SerializeObject((IThing)theObjToSerialize, Formatting.Indented); Console.WriteLine(serialized); 我得到完整的对象为JSON(Id + Name);

如何装饰JSON.NET StringEnumConverter

我正在使用一个api,返回这样的字符串值。 some-enum-value 我尝试将这些值放在枚举中,因为默认的StringEnumConverter没有完成这项工作,我尝试用一​​些额外的逻辑来装饰这个转换器。 如何确保正确反序列化值? 以下代码是我尝试完成这项工作。 但是行reader = new JsonTextReader(new StringReader(cleaned)); 因为base.ReadJson无法将字符串识别为JSON,所以打破了整个事情。 有没有更好的方法来实现这一点,而无需在StringEnumConverter中实现所有的强制逻辑? 如何解决我的方法? public class BkStringEnumConverter : StringEnumConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.String) { var enumString = reader.Value.ToString(); if (enumString.Contains(“-“)) { var cleaned = enumString.Split(‘-‘).Select(FirstToUpper).Aggregate((a, b) => a + b); reader = new […]