你能在.NET中从JSON实例化一个对象实例吗?由于对象初始值设定项与JSON非常相似,因此.NET中现在有匿名类型。能够获取一个字符串(例如JSON)并创建一个代表JSON字符串的匿名对象会很酷。使用对象初始值设定项创建匿名类型:varperson=new{FirstName="Chris",LastName="Johnson"};如果您可以传入对象初始值设定项代码的字符串表示形式(最好是类似JSON的形式)以创建该数据的匿名类型实例会很棒。不知道可不可以,因为C#不是动态的,编译器实际上是把ObjectInitializer和AnonymousType转换成了可以运行的强类型代码。本文将对其进行解释。也许采用JSON并使用它来创建键/值字典的函数效果最好。我知道您可以在.NET中将对象序列化/反序列化为JSON,但我想要的是一种创建基本松散类型对象的方法,类似于JavaScript的工作方式。有谁知道在.NET中执行此操作的最佳解决方案?更新:关于为什么我问这个问题的背景太多......我正在考虑C#如何(可能)在语言级别更好地支持JSON,并且我试图找出它可以的概念原因今天完成。所以,我想我会把它张贴在这里开始讨论。.NET中有一些语言可以使用ducktyping,但是C#不能使用Dot.Notation,因为C#需要在编译时解析所有成员引用。如果你想使用Dot.Notation,你仍然需要在某处定义一个具有你想要的属性的类,并使用你想要的任何方法从JSON数据实例化该类。预定义类确实有很多好处,例如强类型、包括智能感知在内的IDE支持以及不必担心拼写错误。您仍然可以使用匿名类型:Tdeserialize(stringjsonStr,Tobj){/*...*/}varjsonString="{FirstName='Chris',LastName='Johnson,Other='unused'}";varperson=deserialize(jsonString,new{FirstName="",LastName=""});varx=person.FirstName;//strongly-typed你应该看看JSON.net项目:http://james.newtonking.com/pages/json-net.aspx你基本上是在谈论从JSON中混合对象的能力,这将做吧。它不会做匿名类型,但也许它会让你足够接近。我写了一个相对较短的方法,它将解析JSON并返回一个名称/值字典,可以像JavaScript中的实际对象一样访问它。以下是以下方法的示例用法:varobj=ParseJsonToDictionary("{FirstName:"Chris","Address":{Street:"MyStreet",Number:123}}");//访问Address.Number值对象streetNumber=((Dictionary)obj["Address"])["Number"];而,这是ParseJsonToDictionary方法的代码:publicstaticDictionaryParseJsonToDictionary(stringjson){vard=newDictionary();如果(json.StartsWith("{")){json=json.Remove(0,1);如果(json.EndsWith("}"))json=json.Substring(0,json.Length-1);}json.Trim();//从JSON中解析出对象属性while(json.Length>0){varbeginProp=json.Substring(0,json.IndexOf(':'));json=json.Substring(beginProp.Length);varindexOfComma=json.IndexOf(',');字符串endProp;如果(indexOfComma>-1){endProp=json.Substring(0,indexOfComma);json=json.Substring(endProp.Length);}else{endProp=json;json=string.Empty;}varcurlyIndex=endProp.IndexOf('{');如果(curlyIndex>-1){varcurlyCount=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);卷曲计数--;}}json=json.Trim();如果(json.StartsWith(","))json=json.Remove(0,1);json.Trim();//单个属性(名称/值对)是独立的vars=(beginProp+endProp).Trim();//现在解析名称/值对并放入字典varname=s.Substring(0,s.IndexOf(":")).Trim();varvalue=s.Substring(name.Length+1).Trim();如果(name.StartsWith(""")&&name.EndsWith(""")){name=name.Substring(1,name.Length-2);}双valueNumberCheck;if(value.StartsWith(""")&&value.StartsWith(""")){//字符串值d.Add(name,value.Substring(1,value.Length-2));}elseif(value.StartsWith("{")&&value.EndsWith("}")){//JSON值d.Add(name,ParseJsonToDictionary(value));}埃尔斯eif(double.TryParse(value,outvalueNumberCheck)){//数值d.Add(name,valueNumberCheck);}elsed.Add(name,value);}返回d;我知道这个方法可能有点粗糙,它可以优化很多,但它是初稿而且它只是工作另外,在你抱怨它不使用正则表达式之前,请记住并不是每个人都真正理解正则表达式,并且以这种方式编写将使其他人在需要时更难修复它。另外,我目前对正则表达式了解不多,字符串解析更容易。您不能从方法**返回匿名类型,因此“再水化”匿名类型的存在将仅限于再水化方法。有点毫无意义。**你可以将它作为一个对象返回(需要反射来访问它的属性-yeech)或者你可以“通过示例”抛出它,这也是毫无意义的,因为它需要一个额外的步骤,这意味着你已经知道应该是什么类型的对象像这样,那么为什么不首先创建一个对象并填充它呢?这是什么应用?出于某种原因,我不会走这条路。我的解决方案是创建一个只封装字典并将JSON字符串作为构造函数参数的类。然后只需为您要处理的每种类型的JSON查询扩展该类。这将是一种强类型且更快的解决方案,但仍保持可扩展性和易用性。缺点是您需要为每种类型的JSON请求编写更多代码。?以上是C#学习教程:CanyouinstantiateanobjectinstancefromJSONin.NET?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
