Tag: json.net

将EF模型序列化为Json时的循环引用

我知道有很多关于这个主题的问题,但是没有一个问题解决了我的问题。 我正在使用MVC 5和Entity Framework 6以及Newtonsoft.Json。 我有这种例外的通常情况: Service => Staff => Service 当我尝试在我的视图中序列化service对象时,如下所示: var arr = @Html.Raw(@JsonConvert.SerializeObject(Model.Services)); 我得到“ circular reference was detected while serializing an object of type… ”exception。 我在这里找到的所有答案都说它很难解决,我应该补充一下 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings .PreserveReferencesHandling = PreserveReferencesHandling.All; GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings .ReferenceLoopHandling = ReferenceLoopHandling.Serialize; 在我的Global.asax文件中。 好吧,我做了,它只是不起作用。 我在MSDN上阅读了一堆文章,他们都说了同样的话。 我不知道为什么,但它对我不起作用。 我能使其工作的唯一方法是在我的控制器中创建整个序列化上下文: var settings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.All, ReferenceLoopHandling = ReferenceLoopHandling.Serialize }; […]

对象数据类型的Json序列化

public class MyClass { public object BidAutoObject { get; set; } public bool IsApplied { get; set; } } 我有一个类似上面的类,我正在从上面的Class对象创建Json字符串。 属性“BidAutoObject”的类型为“object”。 对象可以是“CxDays”或“AMPM”。 它是动态设置的。 我使用newtonsoft.JsonConvert.SerializeObject将C#对象序列化为Json字符串。 Json序列化的输出就像 “BidAutoObject”: { “IsSun”: true, “IsMon”: false, “IsTue”: true, “IsWed”: true, “IsThu”: false, “IsFri”: true, “IsSat”: true } 所以我无法从上面的json字符串中识别“BidAutoObject类型是”CxDays“还是”AMPM“。如何在序列化过程中添加类型信息。我是否需要向”BidAutoObject“添加任何属性? public class CxDays { public bool IsSun { get; set; } public […]

Wson中的JsonConvert.DeserializeObject和“d”包装器

默认情况下,WCF服务在“d”包装器中包装JSON响应,在那里我发现解析它有问题。 如果我用JsonConvert.DeserializeObject(响应)解析响应 “{\”d\”:\”{\”a0b70d2f-7fe4-4aa2-b600-066201eab82d\”:\”Thelma\”,\”d56d4d4f-6029-40df-a23b-de27617a1e43\”:\”Louise\”}\”}” 我错了: After parsing a value an unexpected character was encoutered: a. Line 1, position 9. 如果我改变响应 “{\”a0b70d2f-7fe4-4aa2-b600-066201eab82d\”:\”Thelma\”,\”d56d4d4f-6029-40df-a23b-de27617a1e43\”:\”Louise\”}” 我搞定了。 那么如何从WCF服务解析这个“d”包装的JSON响应呢? 有没有更好的方法来解析JSON?

JSON.Net – 仅在序列化时使用JsonIgnoreAttribute(但在反序列化时不使用)

我们正在使用JSON.net并希望使用一致的方式来发送和接收数据(文档)。 我们想要一个基类,所有文档都将从中派生出来。 基类将具有DocumentType属性 – 这实际上是类名。 当客户端将此json序列化文档发布到服务器时,我们希望对其进行反序列化,并确保客户端指定的DocumentType与服务器上的ExpectedDocumentType匹配。 然后,当这个文档被服务器序列化并发送到客户端时,我们希望JSON中包含DocumentType属性 – 技巧是我们希望这个值是ExpectedDocumentType的值。 我试图这样做…如果JsonProperty和JsonIgnore属性仅在序列化期间生效而不是反序列化,这将起作用,但遗憾的是情况并非如此。 public abstract class JsonDocument { /// /// The document type that the concrete class expects to be deserialized from. /// //[JsonProperty(PropertyName = “DocumentType”)] // We substitute the DocumentType property with this ExpectedDocumentType property when serializing derived types. public abstract string ExpectedDocumentType { get; } /// […]

使用Entity Framework Core从Newtonsoft JsonSerializer自我引用循环

我遇到了错误: JsonSerializationException:为类型为“Project.Models.Subject”的属性“Subject”检测到自引用循环。 路径’数据[0]。总计’。 当我使用由IEnumerable模型填充的dataGrid加载View时,会发生这种情况。 Grid是一个绑定到View模型的DevExtreme DataGrid,如下所示: @(Html.DevExtreme().DataGrid() .DataSource(Model) .Paging(paging => { paging.Enabled(true); paging.PageIndex(0); paging.PageSize(20); }) .Columns(columns => { columns.Add().DataField(“SubjectId”); … other fields }) ) 这是从Controller中填充的,该控制器使用此function从存储库中提取数据: public async Task<IEnumerable> GetSubjectsAsync() { return await _context.Subject.ToListAsync(); } Subject表与Totals具有1:1的关系,Totals具有对Subject的外键引用。 项目中的模型看起来像这样(从Scaffold-DbContext生成): public partial class Subject { public Guid SubjectId { get; set; } public virtual Totals Totals { get; set; […]

填充对象重用对象和替换数组的对象?

使用Json.NET,我想将JObject映射到.NET对象,具有以下行为: 对于JObject (非null)数组属性,替换目标对象上的整个集合。 对于JObject (非null)对象属性,如果它不为null,则重用目标对象的属性,并仅将提供的属性映射到其上。 JsonSerializer.Populate似乎就是我想要的,如本答案所述 。 至于我正在寻找的行为,似乎我可以通过JsonSerializerSettings.ObjectCreationHandling实现其中一个,但不是两个。 ObjectCreationHandling.Replace根据需求#1执行我想要的操作,而ObjectCreationHandling.Auto根据需求#2执行我想要的操作,但它将数组项附加到现有集合上。 在这里达到这两个要求的推荐方法是什么?

覆盖Json反序列化一个前导零作为小数而不是八进制值的数字

我正在生成一个json对象, { “number”:0100 } 当使用Newtonsoft.Json在C#中反序列化此对象时, 0100被视为八进制数,因为前导零。 有没有办法覆盖此function并使其将数字视为十进制整数?

在将JSON解析为JToken时如何将所有键更改为小写

我有一个JSON字符串,键有大写和小写字符: {“employees”:[ {“FIrstName”:”John”, “LASTname”:”Doe”}, {“FIRSTNAME”:”Anna”, “LaSTNaME”:”Smith”}, {“firstName”:”Peter”, “lastName”:”Jones”} ]} 我想将它转换为JToken对象,并将JToken所有键都JToken为小写。 所以JToken内部应该如下: {“employees”:[ {“firstname”:”John”, “lastname”:”Doe”}, {“firstname”:”Anna”, “lastname”:”Smith”}, {“firstname”:”Peter”, “lastname”:”Jones”} ]} 以前我用的是JToken json = JToken.Parse(jsonString); 转换,但我不知道如何使键小写。 有任何想法吗? 我需要这样做的原因是我的JsonSchemavalidation将不区分大小写。

JSON.NET部分更新Rest API客户端

我正在使用JSON.NET为REST API构建C#/ .NET 4.5客户端。 API支持部分更新; 因此,更新中json中存在或缺少属性具有意义。 如果属性在json中,则服务器将相应地设置该值; 该属性未传递服务器将不会更新它。 这也适用于空值。 我为每个模型都有.NET类; 具有每个JSON属性的属性(非常标准)。 举个例子,假设我有一个已存在于服务器上的帐户对象(名称,备注): { ‘name’:’craig’, ‘notes:’these are notes’ } 如果我传入此json进行更新,它将更新名称,但会将注释设置为“这些是注释”: var account = api.GetAccount(); account.Name = “bob”; api.UpdateAccount(account); { ‘name’:’bob’ } 如果我将此json传递给更新,它将在服务器上将名称和注释设置为null: var account = api.GetAccount(); account.Name = “bob”; account.Notes = null; api.UpdateAccount(account); { ‘name’:’bob’, ‘notes’:null } 到目前为止一切都很好。 我的问题是如何让JSON.NET与它一起很好地发挥作用。 JSON.NET允许控制NullValueHandling,它基本上表示是否应该序列化null值。 然而,在这种情况下这还不够。 我需要能够确定调用代码是否显式将值设置为null。 有没有推荐的方法来处理这个? 我尝试使用我的模型内部的Dictionary来存储要通过JSON序列化的属性。 这允许我通过字典中的键的存在来判断属性是否已被设置为任何(包括null)。 我发现这种方法有一些困难,我最终重写了许多JSON.NET标准的代码(类型序列化,generics,nullables,枚举……)。 […]

序列化为JSON时排除集合中的特定项

我试图“挑选”我要序列化的特定类型的集合中的哪些对象。 示例设置: public class Person { public string Name { get; set; } public List Courses { get; set; } } public class Course { … public bool ShouldSerialize { get; set; } } 我需要能够排除Person.Courses集合中ShouldSerialize为false的所有课程。 这需要在ContractResolver中完成 – ShouldSerialize属性就是一个例子,在我的实际场景中可能还有其他标准。 我不想创建一个ShouldSerializeCourse(如下所示: http ://james.newtonking.com/json/help/index.html?topic = html / ConstditionalProperties.htm) 我似乎无法找出在ContractResolver中覆盖哪个方法。 我怎么会这样呢?