Tag: json.net

JContainer,JObject,JToken和Linq混淆

我无法理解何时使用JContainer , JObject和JToken 。 我从“标准”中JObject是由JObject组成的,而JToken是所有JToken类型的基本抽象类,但我不理解JContainer 。 我正在使用C#,我刚买了LinqPad Pro 5。 我在一个文件中有一个JSON数据源,所以我使用这个语句成功地反序列化了该文件的内容: string json; using (StreamReader reader = new StreamReader(@”myjsonfile.json”)) { json = reader.ReadToEnd(); } 那时,我接受JSON字符串对象并将其反序列化为JObject (这可能是我的错误 – 也许我需要使jsonWork成为JToken或JContainer ?): JObject jsonWork = (JObject)JsonConvert.DeserializeObject(json); 在我的JSON数据(由JSON表示的字符串)中,我有三个对象 – 顶级对象看起来类似于: { “Object1” : { … }, “Object2” : { … }, “Object3″ : { … } } 每个对象都由各种标记(数组,字符串,其他对象等)组成,因此它是动态JSON。 (我使用省略号作为占位符,而不是用大量的JSON数据混淆这个问题。) 但是,我想使用LINQ分别处理”Object1” […]

JSON.NET中基于属性的类型解析

是否可以使用JSON.NET基于JSON对象的属性覆盖类型解析? 基于现有的API,看起来我需要一种接受JsonPropertyCollection并返回要创建的Type的方法。 注意:我知道TypeNameHandling属性 ,但添加了$type属性。 我无法控制源JSON。

JSON序列化类inheritance列表的属性

我有一个模型如下: public class TestResultModel { public bool Successful { get; set; } public string ErrorMessage { get; set; } } public class TestResultListModel : List { public int TotalTestCases { get { return base.Count; } } public int TotalSuccessful { get { return base.FindAll(t => t.Successful).Count; } } } 我从ApiController返回这个TestResultListModel : var testResultListModel = new […]

如何强制Newtonsoft Json序列化所有属性? (“指定”属性的奇怪行为)

同事们,我在Newtonsoft.Json中遇到过一个奇怪的行为。 当我试图序列化一个看起来像这样的对象: public class DMSDocWorkflowI { [JsonProperty(“DMSDocWorkflowIResult”)] public bool DMSDocWorkflowIResult { get; set; } [JsonProperty(“DMSDocWorkflowIResultSpecified”)] public bool DMSDocWorkflowIResultSpecified { get; set; } } 使用这个简单的调用,没有自定义转换器/绑定器/合同解析器: var testObject = new DMSDocWorkflowI(); var json = JsonConvert.SerializeObject(testObject, Formatting.Indented); 或者甚至使用JToken.FromObject(…)我总是只获得一个属性: { “DMSDocWorkflowIResultSpecified”: false } 当我附加跟踪编写器时,它只捕获这个: [0]: “2016-08-30T11:06:27.779 Info Started serializing *****DMSDocWorkflowI. Path ”.” [1]: “2016-08-30T11:06:27.779 Verbose IsSpecified result for property […]

使用反序列化IEnumerable 不起作用

相当新的Json.net并尝试以下简单示例序列化然后解除对象获取以下错误: using Microsoft.VisualStudio.TestTools.UnitTesting; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Text; using System.Collections; namespace Timehunter.Base.ServicesTests { /// /// Summary description for JsonError /// [TestClass] public class JsonError { [TestMethod] public void TestMethod1() { JsonSerializerSettings serializerSettings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.IsoDateFormat, DateParseHandling = Newtonsoft.Json.DateParseHandling.DateTimeOffset }; Act.Activities acts = new Act.Activities(); […]

每个请求的ASP.NET Core API JSON serializersettings

根据请求中的某些值(标题或在url中),我想更改DTO对象的序列化。 为什么? 好吧,我已经将[JsonProperty(“A”)]到我的DTO,但是根据客户端(网站或移动应用程序),它是否要使用该属性。 我开始了 services .AddMvc() .AddJsonOptions(opt => { #if DEBUG opt.SerializerSettings.ContractResolver = new NoJsonPropertyNameContractResolver(); #endif } 因此,在调试时,我获得了具有完整属性名称的JSON。 我使用JsonProperty属性来缩短响应JSON,这适用于移动应用程序(Xamarin),后者反序列化回到相同的DTO。 但现在我有一个网站使用相同的API通过jQuery获取数据,但在那里我想处理DTO的完整属性名称,而不是JsonProperty属性中给出的名称。 网站和WebApi位于同一台服务器上,因此如果响应更大,则没有问题。 我开始使用中间件类来响应客户标头值,这可行,但现在我不知道如何进入JSON SerializerSettings。 搜索网络但找不到它。 在搜索时我已经阅读过关于InputFormatters和OutputFormatters,以及内容协商,但我不知道我必须去哪个方向。 我不想使用不同的设置两次部署相同的API。 如果能有所帮助,我能够改变routesconfig之类的东西。 更新 不仅JSON响应必须以两种不同的方式序列化,而且反序列化必须以两种不同的方式完成。

JSON.net(de)序列化无类型属性

假设我有一个这样的类: public class Example { public int TypedProperty { get; set; } public object UntypedProperty { get; set; } } 假设某人出现并写道: var example = new Example { TypedProperty = 5, UntypedProperty = Guid.NewGuid() } 如果我用JsonConvert.SerializeObject(example)序列化它,我得到 { “TypedProperty”: 5, “UntypedProperty”: “24bd733f-2ade-4374-9db6-3c9f3d97b12c” } 理想情况下,我想得到这样的东西: { “TypedProperty”: 5, “UntypedProperty”: { “$type”: “System.Guid,mscorlib”, “$value”: “24bd733f-2ade-4374-9db6-3c9f3d97b12c” } } 但TypeNameHandling在此方案中不起作用。 我怎样才能(de)序列化一个无类型的属性?

将.Net对象序列化为json,使用xml属性进行控制

我有一个.Net对象,我已经将其序列化为Xml并使用Xml属性进行修饰。 我现在想将相同的对象序列化为Json,最好使用Newtonsoft Json.Net库。 我想直接从内存中的.Net对象转到Json字符串(不先串行化为Xml)。 我不希望向类中添加任何Json属性,而是希望Json序列化程序使用现有的Xml属性。 public class world{ [XmlIgnore] public int ignoreMe{ get; } [XmlElement(“foo”)] public int bar{ get; } [XmlElement(“marco”)] public int polo{ get; } } 变 { “foo”:0, “marco”:0 }

如何在使用Json.NET进行序列化时应用重新映射所有属性名称的一般规则?

将Json对象反序列化为.Net type ,如果字段名称不匹配,我发现您可以使用[JsonProperty(PropertyName = “name”)]来装饰type的属性 这对于几个不匹配的属性来说很好,但是有没有办法设置约定或规则? JSON { “Job”: [ { “Job #”: “1”, “Job Type”: “A”, } ] } C# [JsonProperty(PropertyName = “Job Type”)] public string JobType { get; set; } [JsonProperty(PropertyName = “Job #”)] public string JobNumber { get; set; } 我有很多字段使用相似的名称,我想弄清楚,有没有办法告诉设置规则总是删除空格(EG: Job Type -> JobType )并用#替换# (例如: Job # -> JobNumber )? […]

避免使用默认构造函数和公共属性setter

我正在使用SignalR开展一个项目,而且我有一些我将要通过它的对象。 这些对象只在我的后端代码中显式创建,我真的希望能够对它们强制实现不变性和不变量。 我遇到了SignalR要求我(好吧,实际上是NewtonSoft.Json)的问题,在我的属性上有一个默认的,无参数的构造函数和公共setter,以便它通过网络序列化和反序列化它们。 这是一个人为的例子: public class Message{ public string Text {get;set;} public int Awesomeness {get;set;} } 我想要的是,更多的是这些内容(它应该只有readonly私有字段和getter-only属性完全不可变,但对于只有POCO而没有方法的东西,足够好) public class Message { public string Text {get;private set;} public int Awesomeness {get;private set;} public Message( string msg, int awesome){ if (awesome 5){ throw new ArgumentOutOfRangeException(“awesome”); } Text = msg; Awesomeness = awesome; } } 但是,如果我这样做,我的对象无法通过SignalR .NET客户端库进行反序列化。 我可以在那里查找一个默认构造函数,并将我的setter公开,但是我必须记住不要在我的代码中使用它们,并确保团队中没有其他人在不理解的情况下使用它们。 […]