将 JSON 反序列化为匿名对象

     2023-03-27     32

关键词:

【中文标题】将 JSON 反序列化为匿名对象【英文标题】:Deserialize JSON to anonymous object 【发布时间】:2011-10-17 19:16:55 【问题描述】:

在 C# 中,我已经通过使用这样的代码成功地将匿名对象序列化为 JSON...

var obj = new  Amount = 108, Message = "Hello" ;
JavaScriptSerializer serializer = new JavaScriptSerializer();
String output = serializer.Serialize(obj);

但是,我希望稍后能够将 JSON 字符串反序列化回匿名对象。像这样的……

var obj2 = serializer.Deserialize(output, object);

但 serializer.Deserialize() 方法需要第二个参数,即反序列化到的对象类型。

我试过这个...

var obj2 = serializer.Deserialize(output, obj.GetType());

但这会产生错误:

没有为 'f__AnonymousType0`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0] 类型定义无参数构造函数。 0.0,文化=中性,PublicKeyToken=b77a5c561934e089]]'。

我不确定这个错误是什么意思。

【问题讨论】:

相关帖子 - Deserialize JSON into C# dynamic object? & Deserializing json to anonymous object in c# 【参考方案1】:

动力学怎么样,我看到的最快的方法是这样的:

dynamic myObject = JsonConvert.DeserializeObject<dynamic>(output);

decimal Amount = Convert.ToDecimal(myObject.Amount);
string Message = myObject.Message;

注意: 您将需要 Newtonsoft.json.dll 参考

【讨论】:

【参考方案2】:

JSON.Net 是一个强大的库,可以在 .Net 中使用 JSON

有一个方法DeserializeAnonymousType你可以点击。

更新:Json.Net 现在包含在 ASP.Net 中,但我最近最喜欢使用的是 JsonFX。它也有很好的 linq 支持,看看吧。

更新 2:我已从 JsonFX 继续,目前使用 ServiceStack.Text,速度很快!

【讨论】:

有趣,看起来正是 OP 想要的。 11 月 11 日更新,链接现已损坏 ServiceStack 不是免费的!对我来说,这很重要。我是在达到免费版的限制时才发现的。 ServiceStack 从 4.0.26 开始免费,并且支持反序列化为通用 JsonObjects @thomasb 我不知道你在哪里看到... NuGet 包的许可证至少有一个“限制免费使用”条款(版本 5.2.0)。跨度> 【参考方案3】:

使用the DeserializeObject method 怎么样,它不需要特定类型。这也解决了a similar SO question。该方法反序列化为包含名称/值对的Dictionary&lt;string, object&gt;

更新:澄清您在执行此操作时遇到的错误:

var obj2 = serializer.Deserialize(output, obj.GetType());

给定obj 的类型,Deserialize 将尝试使用默认构造函数创建该类型的新实例。 C# 中的匿名类型没有公共的无参数构造函数,因此操作失败。

【讨论】:

【参考方案4】:

这也可以使用内置的 JavaScriptSerializer 来完成,如下:

object result = new JavaScriptSerializer().DeserializeObject(JSONData);

这将返回一个带有键值对的 object[] 实例。

【讨论】:

不幸的是,这不在 .net core 2.1 中。【参考方案5】:

最近我一直在使用很棒的JsonFx.Net library,我开始欣赏它的作用。您可以使用 Nuget 包管理器在 Visual Studio 中直接安装它。

代码是这样的,

var reader = new JsonReader();
string input = @" ""first"": ""Foo"", ""last"": ""Bar"" ";
var template = new  first=String.Empty, middle=String.Empty, last=String.Empty ;
var output = reader.Read(input, template);

如您所见,您甚至可以为匿名类型指定模板。

【讨论】:

【参考方案6】:

您可以使用NewtonSoft.Json 的DeserializeAnonymousType 方法来做到这一点。

以下示例甚至可以将 JSON 反序列化为匿名对象的列表。使用您希望它反序列化到的任何定义。

var json = System.IO.File.ReadAllText(@"C:\TestJSONFiles\yourJSONFile.json");
var fooDefinition = new  a = "", b = 0 ; // type with fields of string, int
var fooListDefinition = Enumerable.Range(0, 0).Select(e => fooDefinition).ToList();

var foos = JsonConvert.DeserializeAnonymousType(json, fooListDefinition);

【讨论】:

【参考方案7】:

您可以使用 JObject 来反序列化 JSON 字符串:

using Newtonsoft.Json.Linq;

string output = "\"Amount\" = 108, \"Message\" = \"Hello\"";
var amount = JObject.Parse(output)["Amount"];

【讨论】:

【参考方案8】:

如果你使用 Newtonsoft.Json,你可以尝试 DeserializeAnonymousType 方法

    var obj1 = new  Amount = 108, Message = "Hello" ;
    var json=JsonConvert.SerializeObject(obj1);

    // or as well
    var json= " \"Amount\" : 108, \"Message\" : \"Hello\" ";
   
   //Deserialization

   var definition = new  Amount = 0, Message = "" ;

    //obj2 type is "anonymous"
   var obj2 = JsonConvert.DeserializeAnonymousType(json,definition); 

结果

 Amount = 108, Message = "Hello" 

【讨论】:

将 JSON 反序列化为对象

】将JSON反序列化为对象【英文标题】:DeserializingJSONintoanobject【发布时间】:2016-03-1707:26:47【问题描述】:我有一些JSON:"foo":["bar":"baz","bar":"qux"]我想将其反序列化为一个集合。我已经定义了这个类:publicclassFoopublicstringbarget;set;... 查看详情

将 JSON 反序列化为对象

】将JSON反序列化为对象【英文标题】:DeserializingJSONintoanobject【发布时间】:2021-12-1621:52:42【问题描述】:我有一些JSON:"foo":["bar":"baz","bar":"qux"]我想将其反序列化为一个集合。我已经定义了这个类:publicclassFoopublicstringbarget;set;... 查看详情

使用 Json.net 将 JSON 对象反序列化为动态对象

】使用Json.net将JSON对象反序列化为动态对象【英文标题】:DeserializeJSONobjectintodynamicobjectusingJson.net【发布时间】:2011-05-3023:13:12【问题描述】:是否可以使用json.net从json反序列化返回动态对象?我想做这样的事情:dynamicjsonRespons... 查看详情

将 JSON 反序列化为现有对象 (Java)

】将JSON反序列化为现有对象(Java)【英文标题】:DeserializeJSONintoexistingobject(Java)【发布时间】:2012-09-1304:09:20【问题描述】:我想知道如何让JacksonJSON库将JSON反序列化为现有对象?我试图找到如何做到这一点;但它似乎只能接受... 查看详情

将 JSON 命名属性反序列化为 .Net 对象

】将JSON命名属性反序列化为.Net对象【英文标题】:DeserializeJSONnamedpropertyto.NetObject【发布时间】:2012-03-0109:56:21【问题描述】:我使用的API提供了JSON负载。响应的一部分有一个包含命名对象数组的属性。我想我想将这部分反序... 查看详情

将 PHP 对象图序列化/反序列化为 JSON

】将PHP对象图序列化/反序列化为JSON【英文标题】:Serialize/unserializePHPobject-graphtoJSON【发布时间】:2012-05-1610:06:15【问题描述】:我想将完整的PHP对象图序列化为JSON字符串表示,然后将其反序列化回相同的PHP对象图。以下是我考... 查看详情

将 JSON 字符串反序列化为多个 C# 对象

】将JSON字符串反序列化为多个C#对象【英文标题】:DeserializeJSONstringintomultipleC#objects【发布时间】:2019-05-3022:47:28【问题描述】:我有一个以下格式的JSON字符串,我想将其反序列化为C#列表。但是JSON中的记录号“1”、“2”、“... 查看详情

将 JSON 反序列化为 JavaScript 对象

】将JSON反序列化为JavaScript对象【英文标题】:DeserializingaJSONintoaJavaScriptobject【发布时间】:2011-09-2303:36:00【问题描述】:我在使用AJAX访问的Java服务器应用程序中有一个字符串。它看起来像下面这样:varjson=["adjacencies":["nodeTo":"g... 查看详情

将 Objective-C 对象序列化和反序列化为 JSON

】将Objective-C对象序列化和反序列化为JSON【英文标题】:SerializeandDeserializeObjective-CobjectsintoJSON【发布时间】:2011-08-2407:37:27【问题描述】:我需要将objective-c对象序列化和反序列化为JSON以存储在CouchDB中。人们是否有任何示例代... 查看详情

将特定 JSON 字段反序列化为 Unity 中的对象列表

】将特定JSON字段反序列化为Unity中的对象列表【英文标题】:DeserializingspecificJSONfieldsintoalistofobjectsinUnity【发布时间】:2021-09-0907:03:07【问题描述】:对于个人项目,我正在尝试将大型Json数组反序列化为对象列表,但是在遵循其... 查看详情

如何将对象的json数组反序列化为字典[重复]

】如何将对象的json数组反序列化为字典[重复]【英文标题】:Howtodeserializethejsonarrayofobjectstodictionary[duplicate]【发布时间】:2012-01-2123:42:23【问题描述】:我有一个Json字符串"[\'SymptID\':\'"+MidID+"\',\'ALvl\':\'"+JawLvl+"\',\'SymptID\':\'"+BckID+... 查看详情

将json字符串反序列化为python中的对象

】将json字符串反序列化为python中的对象【英文标题】:Deserializeajsonstringtoanobjectinpython【发布时间】:2013-03-0619:10:21【问题描述】:我有以下字符串"action":"print","method":"onData","data":"MadanMohan"我想反序列化为类的对象classpayloadstringa... 查看详情

无法将 JSON 数组反序列化为 C# 对象 [关闭]

】无法将JSON数组反序列化为C#对象[关闭]【英文标题】:UnableDeserializeJSONArraytoC#object[closed]【发布时间】:2021-09-2812:24:24【问题描述】:我有一个HTML页面和一些进行AJAX调用的Javascript代码。在我的API(C#)的服务器端,我收到一个JSON... 查看详情

javascriptserializer类对象序列化为json,json反序列化为对象

JavaScriptSerializer类由异步通信层内部使用,用于序列化和反序列化在浏览器和Web服务器之间传递的数据。说白了就是能够直接将一个C#对象传送到前台页面成为javascript对象。要添加System.Web.Extensions.dll的引用。该类位于System.Web.Scri... 查看详情

无法将 JSON 字符串反序列化为 C# 对象

】无法将JSON字符串反序列化为C#对象【英文标题】:UnabletodeseralizeJSONStringtoaC#Object【发布时间】:2021-04-2710:11:03【问题描述】:我正在尝试将从https://my-json-server.typicode.com/dskato/UDLAProyectoApi/posts检索到的JSON字符串转换为我的“客... 查看详情

Json.NET:将嵌套数组反序列化为强类型对象

】Json.NET:将嵌套数组反序列化为强类型对象【英文标题】:Json.NET:deserializenestedarraysintostronglytypedobject【发布时间】:2012-10-1514:13:22【问题描述】:我正在编写客户端应用程序,它应该处理服务器响应。响应采用JSON格式。我决... 查看详情

如何将java对象序列化/反序列化为javax.json

从Java7开始,就有了JSON标准。是否有一个简单或标准的解决方案,用于将Java对象序列化为JSON并再次返回?答案你可以试试Gson。它非常简单易用。另一答案您可以使用jaxb注释。 查看详情

将嵌套的 JSON 反序列化为 C# 对象

】将嵌套的JSON反序列化为C#对象【英文标题】:DeserializenestedJSONintoC#objects【发布时间】:2016-12-1202:24:38【问题描述】:我从如下所示的API获取JSON:"Items":"Item322A":["prop1":"string","prop2":"string","prop3":1,"prop4":false,"prop1":"string","prop2":"st... 查看详情