Tag: json

使用.NET将Json转换为List

经过几天试图将Json转换为对象列表,我就在这里。 我有一个返回Json字符串的REST API: { GetItemsListResult:”[ { “code”:”VOL00056″, “clsID”:223108653, “type”:2, “status”:1, “free”:0.0, “total”:671088640.0, “perc”:99, “descr”:”no mailing”, “dt”:20160926, “tm”:112456, “full”:1 }, { “code”:”VOL00055″, “clsID”:111760419, “type”:2, “status”:1, “free”:0.0, “total”:671088640.0, “perc”:99, “descr”:”Email”, “dt”:20160817, “tm”:222411, “full”:1 } ]” } 我知道这个字符串来自DataTable: String JSONresult = JsonConvert.SerializeObject(ds.Tables[0]); 我创建了两个类:一个描述对象模型,另一个描述对象模型。 但是在尝试时 VolumeCollection volumes = Newtonsoft.Json.JsonConvert.DeserializeObject(listVolumes); 我获取无法转换或从System.String转换为System.Collections.Generic.List`1 [卷]。 怎么了? 卷类: public class Volume { public String […]

如何处理Json.Net解析中的错误

我正在使用Json.Net进行Json反序列化。 有时我读的Json字符串不正确(我无法修复,因为我不生成它)。 特别是,在一个特定的地方,应该有一个字符串,有时会有一个序列化的对象。 Json.Net然后抱怨,并不奇怪,找到一个预期字符串的对象。 我发现我可以通过在JsonSerializerSettings使用Error来拦截它,并通过设置ErrorContext.Handled使Json.Net忽略该问题。 但我想做更多。 如果我可以查看序列化对象,我可以弄清楚字符串应该是什么,并在理论上提供正确的答案。 在实践中,我无法想象我们如何做到这一点。 特别是在error handling程序中: 如何访问解析器绊倒的字符串(注意,如果设置了ErrorContext.Handled ,解析器可以成功继续,因此它可以正确地确定问题字符串的开始和结束)? 如何将正确的字符串提供给解析器,或者可以访问当前解析的对象,以便我可以手动设置该值? [编辑]根据要求提供简化示例: 我要解析的错误的Json字符串: { “id”: 2623, “name”: { “a”: 39, “b”: 0.49053320637463277, “c”: “cai5z+A=”, “name”: “22” }, “children”: [ { “id”: 3742, “name”: { “a”: 37, “b”: 0.19319664789046936, “c”: “Me/KKPY=”, “name”: “50” }, “children”: [ { “id”: 1551, “name”: { “a”: 47, “b”: […]

如何使用json.net“内联”生成json中的属性

我在我的一个类中有一个属性,我正在尝试使用json.net进行序列化,我想“内联”,这意味着,我不希望将属性嵌套到具有属性名称的元素中,但其内容直接在其母公司内。 这是一个例子,假设我有以下类结构: public interface ISteeringWheelIdentifier {} public interface ISteeringWheel { ISteeringWheelIdentifier Identifier {get;} } public class ManufacturerIdentifier : ISteeringWheelIdentifier { public string ManufacturerEmail {get; set;} } public class PartNumberIdentifier : ISteeringWheelIdentifier { public string PartNumber {get; set;} } public class ClassicSteeringWheel : ISteeringWheel { public ClassicSteeringWheel(ManufacturerIdentifier identifier) { Identifier = identifier; } public string HornButtonManufacturer […]

通过JSON.NET到ExpandoObject的JSON数组

我使用以下方法将我的大多数API JSON结果转换为对象: public void ExpandoObject() { var sampleDATA = Sample.Create(); var json = JsonConvert.SerializeObject(sampleDATA); var expConverter = new ExpandoObjectConverter(); dynamic obj = JsonConvert.DeserializeObject(json, expConverter); var a = obj.A; var b = obj.B; var c = obj.C; //and so on… } 但是,我遇到了这种JSON格式的奇怪情况…… [ { “id”: 42, “name”: “example name”, “member_count”: 42, “created_date”: “example created_date”, “last_update”: “example […]

在没有唯一属性名称的情况下反序列化JSON

我有一个json字符串,如下所示 { “1ST”: { “name”: “One”, “symbol”: “1st” }, “2ND”: { “name”: “Two”, “symbol”: “2nd” } } 我试图将其序列化为C#对象。 看起来它正在创建一个Dictionary,所以我创建了以下结构 public class Response { public Dictionary Objects { get; set; } } public class Item { public string name { get; set; } public string symbol { get; set; } } 并且在序列化期间运行以下内容 response = JsonConvert.DeserializeObject(jsonString); 它不会在反序列化时抛出错误,但我的响应只是返回null。 […]

在Mono中反序列化JSON数据

使用Monodroid时,有一种简单的方法可以将简单的JSON字符串反序列化为.NET对象吗? System.Json只提供序列化(没有反序列化),我尝试过的各种第三方库都会导致Mono / Monodroid出现问题。 谢谢。

当字段名包含空格时,反序列化JSON

我正在编写一个读取JSON文件的工具。 我正在使用NewtonSoft工具将JSOn反序列化为C#类。 这是一个示例片段: “name”: “Fubar”, “.NET version”: “4.0”, “binding type”: “HTTP”, 字段名称包含空格和C#标识符中无效的其他字符(。)。 这样做的正确方法是什么? (很遗憾,我没有更改JSON格式的选项。)

强制将空JSON数组转换为Dictionary类型

问题是,PHP中的json_encode()函数为正在读取其输出的工具留下了歧义。 在PHP中,列表和字典都是相同类型的array 。 echo json_encode([]); // [] echo json_encode([“5” => “something”]); // {“5”: “something”} 在JSON.NET中,我想强制将[]和{“5”: “something”}转换为Dictionary类型。 但是它将[]识别为Dictionary的禁止结构并抛出exception。 我可以快速保留空的JSON数组或强制它们转换为空的Dictionary类型吗? 最终解决方案 我修改了接受的答案,使其成为通用的,并可重用于其他类型。 public class DictionaryOrEmptyArrayConverter : JsonConverter { public override bool CanWrite { get { return false; } } public override bool CanConvert(Type objectType) { return objectType == typeof(Dictionary); } public override object ReadJson(JsonReader reader, Type objectType, […]

确定属性的值是数组

我有一个JSON文件: { “abn”:”63119059513″, “acn”:”119059513″, “business_structure”:”Private Company”, “ngr_number”:”1231231″, “cbh_number”:”1231231″, “main_name”:”Brickworks Building Products Pty Ltd”, “trading_name”:”Brickworks”, “other_trading_names”:”Austral Bricks”, “directors”:[ { “ID”:”12114″, “ae_forms_filled_in_ID”:”22739″, “name”:”John Smith”, “dob”:”1983-10-29″, “address_line_1″:”123 Fake Street”, “address_line_2″:””, “address_line_city”:”Fakeland”, “address_line_postcode”:”2000″, “address_line_state”:”New South Wales”, “address_line_country”:”Australia”, “order_extract_id”:null, “director_found”:null, “drivers_lic”:””, “home_mortgage”:””, “phone”:””, “mobile”:””, “director_email”:””, “director_title”:”Mr”, “director_position”:”Director”, “dir_pdf_url”:null } ], } 我想确定任何属性的值是否具有数组结构。 到目前为止,我能想出的最好的是: StreamReader streamrr = new StreamReader(“C:\\temp\\agfarm_example_udate.json”, Encoding.UTF8); string […]

使用Json.NET填充非可序列化对象

在测试中,我想从JSON字符串填充对象(视图模型)。 例如,目标对象具有以下属性: public string Query { get; set; } 所以我希望能够做到这一点: var target = …; JsonConvert.PopulateObject(target, “{ ‘Query’: ‘test’ }”); 但是,未设置Query属性。 通过代码进行调试,似乎忽略了target上的属性,因为成员序列化是选择加入的。 由于目标类不是数据契约,并且在unit testing之外没有以这种方式填充,因此我无法通过属性将其选择为成员序列化。 我找不到从外部修改成员序列化的方法。 我希望PopulateObject的重载采取设置将允许我这样做,但我没有看到任何方法这样做。 如何确保PopulateObject在我的目标上设置属性,即使它不是数据协定?