【问题标题】:Deserialize JSON data into any type in C#在 C# 中将 JSON 数据反序列化为任何类型
【发布时间】:2013-10-08 19:11:19
【问题描述】:

我希望能够将任何类型的数据从 javascript 发送到 C#。基本上,我正在尝试通过包含此对象的 AJAX 调用从 Javascript 端发送 JSON 对象-

AnObject = new Object;
AnObject.value = anyValue;

$.ajax({
    type: "POST",
    url: "myURL",
    data: "{ 'myObject':" + JSON.stringify(AnObject) + "}",
    dataType: 'json',
    success: function (data) {
        //do something
    }
});

anyValue 可以是 int、字符串、数组、关联数组、日期等。

在 C# 方面,我需要一个类似 -

的类
public AnyClass {
    DataType(?) value;
}

public ActionResult acceptData(AnyClass myObject) {
    Here, the data should be deserialized correctly depending on it's type into DataType(?)
}

这可能吗?我确定 C# 中有一些我可以使用的泛型类型?

【问题讨论】:

  • 您可以使用 this 库反序列化 JSON 数据。在链接中有一些示例说明如何使用
  • 你使用 ASP.NET MVC 吗?
  • @JaroslawWaliszko,是的,我使用 ASP.NET MVC,将标签添加到问题中

标签: c# javascript asp.net-mvc json


【解决方案1】:

从技术的角度来看,这是可能的。但是你必须自己弄清楚几个重要的细节:

  • 您如何知道要构建的对象类型?
  • 您将如何构造该类型的对象?你能假设该类型有一个默认构造函数吗?你会使用某种 DI 框架吗?

如果您愿意说创建的所有对象确实需要是 POCO 样式的对象,那么这变得非常简单:

public ActionResult acceptData() {
    Type type = FigureOutWhatTypeToUse();
    object instance = Activator.CreateInstance(type);
    // This allows ASP.NET MVC's model binding to do the dirty work,
    // initializing the properties of your instance based on the submitted
    // parameters.
    TryUpdateModel((dynamic) instance, "myObject"); 
}

如果你想传入一个数组,定义一个对象类型,它有一个带有数组的属性。这样,MVC 可以了解属性应该是一个数组这一事实并相应地绑定它。

PS——这对我来说似乎更具可读性且不易出错:

data: JSON.stringify({ myObject : AnObject }),

【讨论】:

  • 我不确定我是否完全理解你。 .NET 会自动为我们处理反序列化,对吗?所以我所要做的就是确保我的 AnyClass 上的值是可以存储任何数据类型的通用类型。这个假设是错误的吗?
  • @neuDev33:.NET 可以正确处理最常见的反序列化情况,只要它知道您正在处理的对象类型。如果 JSON 字符串中的 Value"5",那么它是表示您尝试创建的 C# 类中的整数、枚举还是字符串?由于您无法在编译时知道您正在构建什么类型的对象,因此您需要设计一种在运行时知道这一点的方法。
  • 好的,我明白你的意思了。当您说我需要设计一种在运行时了解类型的方法时,您是在要求我绕过 .NET 的默认反序列化机制并自己做一些事情吗?请您指出正确的方向吗?
  • @neuDev33:我提供了利用 MVC反序列化的代码,但我无法为您解决的一个问题是如何在运行时,当调用此方法时,您将知道您实际想要生成的对象类型。如果您提供更多关于您打算在拥有该对象后做什么的上下文,也许我可以提供更多帮助?你肯定不能直接针对一个你对它的结构一无所知的对象编写任何有用的代码吗?
【解决方案2】:

看看如何将对象从 JSon 序列化和反序列化为它们对应的类型。 这非常简单:

http://msdn.microsoft.com/en-us/library/bb412179.aspx

【讨论】:

  • 我的问题更多是关于如何创建一个可以存储任何类型数据的对象,而不是关于序列化和反序列化本身。我认为您发布的链接涵盖了后者而不是前者的基础知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多