你能从.NET中的JSON实例化一个对象实例吗?
由于Object Initializers与JSON非常相似,现在.NET中有匿名类型。 能够获取字符串(例如JSON)并创建表示JSON字符串的匿名对象会很酷。
使用对象初始值设定项创建匿名类型:
var person = new { FirstName = "Chris", LastName = "Johnson" };
如果您可以传入Object Initializer代码的字符串表示(最好是类似JSON)来创建具有该数据的匿名类型的实例,那将是非常棒的。
我不知道是否可能,因为C#不是动态的,并且编译器实际上将Object Initializer和Anonymous Type转换为可以运行的强类型代码。 本文将对此进行说明。
也许使用JSON并使用它创建键/值Dictionary的function将最有效。
我知道你可以在.NET中将一个对象序列化/反序列化为JSON,但我想要的是一种创建一个基本上松散类型的对象的方法,类似于JavaScript的工作方式。
有谁知道在.NET中这样做的最佳解决方案?
更新:太清楚我为什么要问这个问题的背景……我在考虑C#如何在语言层面(可能)更好地支持JSON,而我正试图想办法今天可以做到的概念原因。 所以,我想我会把它发布在这里开始讨论。
.NET中有一些语言可以使用鸭子类型,但是C#使用Dot.Notation是不可能的,因为C#要求在编译时解析所有成员引用。 如果要使用Dot.Notation,您仍然需要在某处定义具有所需属性的类,并使用您想要从JSON数据实例化该类的任何方法。 预先定义一个类确实有很多好处,比如强类型,IDE支持包括intellisense,并且不用担心拼写错误。 您仍然可以使用匿名类型:
T deserialize(string jsonStr, T obj) { /* ... */} var jsonString = "{FirstName='Chris', LastName='Johnson, Other='unused'}"; var person = deserialize(jsonString, new {FirstName="",LastName=""}); var x = person.FirstName; //strongly-typed
你应该看看JSON.net项目:
https://james.newtonking.com/pages/json-net.aspx
你基本上是在谈论从JSON中水合对象的能力,这将会做到。 它不会做匿名类型,但也许它会让你足够接近。
我编写了一个相对较短的方法,它将解析JSON并返回一个名称/值Dictionary,可以类似于JavaScript中的实际对象进行访问。
以下是以下方法的示例用法:
var obj = ParseJsonToDictionary("{FirstName: "Chris", "Address":{Street:"My Street",Number:123}}"); // Access the Address.Number value object streetNumber = ((Dictionary)obj["Address"])["Number"];
而且,这是ParseJsonToDictionary方法的代码:
public static Dictionary ParseJsonToDictionary(string json) { var d = new Dictionary(); if (json.StartsWith("{")) { json = json.Remove(0, 1); if (json.EndsWith("}")) json = json.Substring(0, json.Length - 1); } json.Trim(); // Parse out Object Properties from JSON while (json.Length > 0) { var beginProp = json.Substring(0, json.IndexOf(':')); json = json.Substring(beginProp.Length); var indexOfComma = json.IndexOf(','); string endProp; if (indexOfComma > -1) { endProp = json.Substring(0, indexOfComma); json = json.Substring(endProp.Length); } else { endProp = json; json = string.Empty; } var curlyIndex = endProp.IndexOf('{'); if (curlyIndex > -1) { var curlyCount = 1; while (endProp.Substring(curlyIndex + 1).IndexOf("{") > -1) { curlyCount++; curlyIndex = endProp.Substring(curlyIndex + 1).IndexOf("{"); } while (curlyCount > 0) { endProp += json.Substring(0, json.IndexOf('}') + 1); json = json.Remove(0, json.IndexOf('}') + 1); curlyCount--; } } json = json.Trim(); if (json.StartsWith(",")) json = json.Remove(0, 1); json.Trim(); // Individual Property (Name/Value Pair) Is Isolated var s = (beginProp + endProp).Trim(); // Now parse the name/value pair out and put into Dictionary var name = s.Substring(0, s.IndexOf(":")).Trim(); var value = s.Substring(name.Length + 1).Trim(); if (name.StartsWith(""") && name.EndsWith(""")) { name = name.Substring(1, name.Length - 2); } double valueNumberCheck; if (value.StartsWith(""") && value.StartsWith(""")) { // String Value d.Add(name, value.Substring(1, value.Length - 2)); } else if (value.StartsWith("{") && value.EndsWith("}")) { // JSON Value d.Add(name, ParseJsonToDictionary(value)); } else if (double.TryParse(value, out valueNumberCheck)) { // Numeric Value d.Add(name, valueNumberCheck); } else d.Add(name, value); } return d; }
我知道这个方法可能有点粗糙,它可能会进行相当多的优化,但它是第一个草案,它只是起作用。
此外,在您抱怨它不使用正则表达式之前,请记住,并非每个人都真正理解正则表达式,并且以这种方式编写将使其他人更难以在需要时进行修复。 另外,我目前还不太了解正则表达式,并且字符串解析更容易。
您不能从方法**返回匿名类型,因此“重新水合”匿名类型的存在将仅限于重新水合的方法。 有点无意义。
**你可以将它作为一个对象返回(需要reflection才能访问它的属性 – yeech)或者你可以“通过示例”抛出它,这也是毫无意义的,因为它需要额外的步骤,这意味着你已经知道了什么对象的类型应该是这样的,那么为什么不创建一个对象并在第一时间填充它?
这是什么应用?
出于某些原因,我不会走这条路。
我的解决方案是创建一个只封装字典并将JSON字符串作为ctor参数的类。 然后只为要处理的每种类型的JSON查询扩展该类。 这将是一个强类型和更快的解决方案,但仍然保持可扩展性和易用性。 缺点是每种类型的JSON请求需要编写更多代码。
?
上述就是C#学习教程:你能从.NET中的JSON实例化一个对象实例吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1033631.html