Tag: json.net

JSON.NET – 如何为存储在数组/列表中作为对象类型的原始C#类型包括类型名称处理

我正在使用Newtonsoft JSON.NET为我序列化/反序列化。 但我有这个列表,其中它们是Object类型: var list = new List() { “hi there”, 1, 2.33 }; 当我将TypeNameHandling设置为TypeNameHandling.All序列化时,我希望它也会为列表中的每个实例提供$type ,但似乎不是这种情况。 这是实际输出: { “$type”: “System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib”, “$values”: [ “hi there”, 1, 2.33 ] } 我需要这个原始类型具有特定的类型名称处理,因为如果我在列表中添加一个Int32值,并在反序列化后返回它,JSON.NET将其设置为Int64 。 这对我来说是一件大事,因为我试图调用一些方法并且这样做我需要比较参数,它们必须具有相同的类型。 有没有可以在JSON.NET中设置的方法或设置来实现我的需求? 我已经看过这篇文章,但它的作用是他试图改变默认行为并且总是返回Int32 ,这不是我正在寻找的。 任何帮助,将不胜感激。 谢谢

JSON.NET C#中的反序列化导致空对象

我正在尝试使用JSON.NET反序列化来填充C#对象(ImportedProductCodesContainer)和数据。 ImportedProductCodesContainer.cs: using Newtonsoft.Json; [JsonObject(MemberSerialization.OptOut)] public class ImportedProductCodesContainer { public ImportedProductCodesContainer() { } [JsonProperty] public ActionType Action { get; set; } [JsonProperty] public string ProductListRaw { get; set; } public enum ActionType {Append=1, Replace}; } JSON字符串: {“ImportedProductCodesContainer”:{“ProductListRaw”:”1 23″,”Action”:”Append”}} C#代码: var serializer = new JsonSerializer(); var importedProductCodesContainer = JsonConvert.DeserializeObject(argument); 问题是importProductCodesContainer在运行上面的代码后仍然为空(Action = 0,ProductListRaw = null)。 你能帮我弄清楚出了什么问题吗?

如何干净地反序列化JSON,其中字符串值包装在同名对象中

我想将一些奇怪的JSON反序列化为C#类: { “Result”: { “Client”: { “ProductList”: { “Product”: [ { “Name”: { “Name”: “Car polish” } } ] }, “Name”: { “Name”: “Mr. Clouseau” }, “AddressLine1”: { “AddressLine1”: “Hightstreet 13” } } } } json2csharp为JSON生成以下类: public class Name { public string Name { get; set; } } public class Product { public Name Name […]

这可能在JSON中吗?

我目前正在使用json.net! 我知道如何反序列化json数据以及如何使用我们的类进行映射。 现在我渴望一些疑问! 假设我的jsonstrings是 “attributes”:{ “color”:”Brown”, “condition”:”Used”, “currency”:”USD”, “price”:”10500″, “price_display”:”$10,500″, } 和我的属性类( 我想在其上反序列化字符串 )是 Public class Attribute { public string name{ get; set; } public string value{ get; set; } } 现在我使用以下代码进行反序列化。 JavaScriptSerializer ser = new JavaScriptSerializer(); p = ser.Deserialize(jsonString); 显然,这段代码根本不适用于上面的jsonstring。 现在如何在一个类中绑定这些名称值对? 这可能吗 ? 将来,属性可能超过10但格式将与名称值对相同

DateTime.TryParse无法解析DateTime.MinValue

我正在使用一个名为Json.NET的库,它在内部使用以下代码将JSON字符串解析为DateTime: if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt); return dt; } 我认为Json.NET搞砸了转换,但看起来它是DateTime.TryParse本身就是拙劣的价值。 当我解析以下有效的Iso日期(对应于UTC DateTime.MinValue)时: string json = “0001-01-01T00:00:00+00:00”; DateTime dt; DateTime.TryParse(json, invariantCulture, DateTimeStyles.RoundtripKind, out dt); 结果是本地化的DateTime: {0001-01-01 8:00:00 PM} ,当转换回Utc时间时, {0001-01-02 0:00:00 PM} 。 基本上,日期下溢,这正是您期望DateTimeStyles.RoundtripKind要避免的问题。 我该如何避免这种情况?

JSON.Net错误地将二维数组序列化为一维

试图将二维数组转换为二维JSON.Net数组。 下面的代码有什么问题吗? 或者JSON.Net不支持这个吗? var A = new int[2, 4] { { 1, 1, 1, 1 }, { 2, 2, 2, 2 } }; Console.WriteLine(JsonConvert.SerializeObject(A)); // CONSOLE: [1,1,1,1,2,2,2,2] // // NB. displays a one dimensional array // instead of two eg [[1,1,1,1],[2,2,2,2]]

只有在Json.Net中没有显式设置PropertyName时才使用CamelCase?

我在我的网站上使用Json.Net。 我希望序列化程序默认在camelcase中序列化属性名称。 我不希望它更改我手动分配的属性名称。 我有以下代码: public class TestClass { public string NormalProperty { get; set; } [JsonProperty(PropertyName = “CustomName”)] public string ConfiguredProperty { get; set; } } public void Experiment() { var data = new TestClass { NormalProperty = null, ConfiguredProperty = null }; var result = JsonConvert.SerializeObject(data, Formatting.None, new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver()} ); […]

使用JSON.NetvalidationJsonConvert.DeserializeObject的结果(想想“尝试解析”)

我有传入的消息,我需要尝试在我自己的对象结构中解析。 这些都是形成良好的JSON主题,有些只是无稽之谈。 我使用JsonConvert.DeserializeObject(incmoingString); 去做这个。 然而,当输入是总垃圾时,这有时会给我一个例外。 其他时候,当传入的字符串是好的时候,我得到一个非完整的对象结构 – 最后它有时会工作。 我已经在try / catch中包装了转换,而不是手动validation我已经获得了反序列化结果所需的属性。 有一个更好的方法吗?

我可以使用Newtonsoft.Json进行严格的反序列化吗?

我正在使用Newtonsoft.Json来序列化/反序列化对象。 据我所知,如果类没有无参数构造函数,则反序列化无法成功。 例, public class Dog { public string Name; public Dog(string n) { Name = n; } } 对于下面这个类,代码正确生成对象。 Dog dog1 = Newtonsoft.Json.JsonConvert.DeserializeObject(“{\”Name\”:\”Dog1\”}”); 对我来说,令人惊讶的是,它也可以使用以下代码正确生成对象。 Dog dog2 = Newtonsoft.Json.JsonConvert.DeserializeObject(“{\”name\”:\”Dog2\”}”); Dog dog3 = Newtonsoft.Json.JsonConvert.DeserializeObject(“{\”n\”:\”Dog3\”}”); Dog dog4 = Newtonsoft.Json.JsonConvert.DeserializeObject(“{\”N\”:\”Dog4\”}”); 现在我能想到的就是 Json转换器在进行reflection时忽略了区分大小写。 此外,如果它面向构造函数,它用json字符串填充参数(就好像参数名称是json字符串)。 我不确定,但也许这就是他们称之为灵活的原因。 这是我的问题: 如果我的class级是这样的, public class Dog { public string Name; public Dog(string name) { Name […]

无法将类型为“Newtonsoft.Json.Linq.JObject”的对象强制转换为“System.Runtime.Serialization.ISafeSerializationData”

我试图反序列化一个web api调用得到以下exception – 消息是模糊的,所以我无法理解发生了什么 – 这个演员在其他情况下工作不确定这里有什么问题: 例外: InnerException: System.Reflection.TargetInvocationException _HResult=-2146232828 _message=Exception has been thrown by the target of an invocation. HResult=-2146232828 IsTransient=false Message=Exception has been thrown by the target of an invocation. Source=mscorlib StackTrace: at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, […]