Tag: json

如何从WCF REST方法返回自定义类型值的Dictionary作为常规JSON对象?

假设我有一个看起来像这样的自定义类型: [DataContract] public class CompositeType { [DataMember] public bool HasPaid { get; set; } [DataMember] public string Owner { get; set; } } 和一个如下所示的WCF REST接口: [ServiceContract] public interface IService1 { [OperationContract] Dictionary GetDict(); } 那么我如何让我的方法实现返回一个看起来像这样的JSON对象… {“fred”:{“HasPaid”:false,”Owner”:”Fred Millhouse”},”joe”:{“HasPaid”:false,”Owner”:”Joe McWirter”},”bob”:{“HasPaid”:true,”Owner”:”Bob Smith”}} 我不希望它看起来像这样: [{“Key”:”fred”,”Value”:{“HasPaid”:false,”Owner”:”Fred Millhouse”}},{“Key”:”joe”,”Value”:{“HasPaid”:false,”Owner”:”Joe McWirter”}},{“Key”:”bob”,”Value”:{“HasPaid”:true,”Owner”:”Bob Smith”}}] 理想情况下,我宁愿不必改变方法的返回类型。 我尝试了很多不同的方法,但找不到有效的解决方案。 令人讨厌的是,使用Newtonsoft.Json在一行中生成正确形状的JSON对象结构很容易: string json = JsonConvert.SerializeObject(dict); 其中dict定义为: Dictionary dict = […]

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中覆盖哪个方法。 我怎么会这样呢?

将JSON反序列化为对象C#

你好,我迫切需要一些帮助。 我有一个json文件,带有一个json对象数组。 我无法弄清楚如何将其反序列化为此对象的列表。 我的JSON在文件中采用这种格式 – 它有数千行,这只是一个示例: [{ “Rk”: 1, “Gcar”: 467, “Gtm”: 1, “Date”: “Apr 6”, “Tm”: “CLE”, “Where”: “@”, “Opp”: “HOU”, “Rslt”: “L0-2”, “Inngs”: “CG”, “PA”: 4, “AB”: 4, “R”: 0, “H”: 0, “Doubles”: 0, “Triples”: 0, “HR”: 0, “RBI”: 0, “BB”: 0, “IBB”: 0, “SO”: 0, “HBP”: 0, “SH”: 0, “SF”: 0, “ROE”: […]

将JSON对象层次结构反序列化为Dictionary 的层次结构

我在.NET中用于WinRT(C#) ,我想将JSON字符串反序列化为Dictionary ,其中字典值稍后可以转换为实际类型。 JSON字符串可以包含对象层次结构,我想在Dictionary中也有子对象。 这是一个它应该能够处理的示例JSON: { “Name”:”John Smith”, “Age”:42, “Parent”: { “Name”:”Brian Smith”, “Age”:65, “Parent”: { “Name”:”James Smith”, “Age”:87, } } } 我尝试使用DataContractJsonSerializer这样做: using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json))) { DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings(); settings.UseSimpleDictionaryFormat = true; DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Dictionary), settings); Dictionary results = (Dictionary)serializer.ReadObject(ms); } 这实际上适用于第一级,但是“Parent”只是一个无法转换为Dictionary : Dictionary parent = (Dictionary)results[“Parent”]; […]

序列化时出现JSON .Net Windows Mobile错误

我正在运行这段代码: string serialized = JsonConvert.SerializeObject(somethingToSend); 它抛出了这个exception: MissingMethodException:无法从程序集’mscorlib,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 969DB8053D3322AC’加载类型’System.Runtime.Serialization.StreamingContext’。 这是我的配置: Visual Studio 2008(包含所有最新的服务包等) 针对Windows Mobile 6 .Net 3.5的智能设备项目 Json DotNet 4.5版第7版(从zip中的WindowsPhone文件夹引用DLL) 这个问题的答案“ 在Windows Mobile上有没有可以在C#中读取JSON的库? ”意味着它应该可以工作。 我在调试中运行它与附加的真实设备(所以没有模拟器)我以前从这里安装了CAB文件而没有错误: C:\ Program Files(x86)\ Microsoft.NET \ SDK \ CompactFramework \ v3.5 \ WindowsCE \ NETCFv35.wce.armv4.cab 应用程序运行正常,直到我点击运行上面一行的按钮,所以有人知道我缺少什么吗? 这个post“ 用于Windows CE 5.0的Json.Compact.dll? ”表明我需要安装Windows SDK,我有。 鉴于它在设备上运行,我想这无论如何都不会是修复。 另一个建议是从源代码构建,但像问题的作者一样,我无法将项目文件加载到VS 2008中来执行此操作。 我可以创建一个新项目并包含源文件并尝试将其编译,但在我这样做之前,我想我会问这里是否值得,或者设备上的安装是否还有其他东西丢失? […]

从Web服务(内存不足)反序列化大型JSON对象

我有一个程序,从Web服务反序列化大对象。 在webservice调用和200之后,代码看起来像这样。 JsonConvert.DeserializeObject<List>(resp.Content.ReadAsStringAsync().Result).ToList() 有时在运行此过程时,我将得到一个聚合exception,它将内部exception显示为内存不足。 我无法确定它是否是读取JSON数据字符串(可能非常大)或导致此问题的反序列化的过程。 我想要做的是打破字符串并从响应中单独拉回每个JSON对象,然后反序列化它。 我很难找到一种方法,一次只从响应中带出一个JSON对象。 任何建议都非常感谢!

无法确定类型“Class”的JSON对象类型

尝试将类型类的对象添加到JArray时,我收到以下错误。 Could not determine JSON object type for type “Class” 这是我正在使用的代码: private dynamic _JArray = null private JArray NArray(Repository repository) { _JArray = new JArray(); string[] amounts = repository.Amounts.Split(‘|’); for (int i = 0; i <= amounts.Length; i++) { _JArray.Add( new AmountModel { Amounts = amounts[i], }); } return _JArray; } public class AmountModel { […]

JavaScriptSerializer – 自定义属性名称

我正在使用JavaScriptSerializer来反序列化json数据。 一切都很好,但我的问题是,json数据中的一个属性被命名为“base”,所以我不能在我的C#代码中创建这样的属性。 我发现我可以手动将值映射到构造函数中的属性,但问题是,我的DTO有200个属性,所以我不想手动制作,而是希望找到任何其他解决方案。 我也尝试使用注释,但这个: [JsonProperty(“base”)] public int baseValue { get; set; } 没有帮助我,值baseValue每次设置为0(如果你认为,这个注释应该工作,我可以发布我的整个代码,不仅这2行) 有什么办法可以简单地解决我的问题吗?

编辑界面时它叫什么?

我正在浏览LitJSON库。 在代码中有很多段,如 public class JsonData : IJsonWrapper, IEquatable #region ICollection Properties int ICollection.Count { get { return Count; } } #end region 对于我知道覆盖/重载如何工作的方法,但在上面的示例中,代码为:int ICollection.Count 我不熟悉方法签名的格式。 编码器是否试图明确声明其ICollection.Count接口? 你能解释一下这是什么“被称为”(它是否仍在重写?)。