VS 2010 中的 C# .Net 4.0 反序列化实时类型 json 无类型

C# .Net 4.0 in VS 2010 deserialize real-time typed json without type

我有一些代码可以执行 http 请求处理器的某些部分。当某些网络请求进入时,例如 PUT,附加 xml 或 json,我必须将有效负载(字符串)转换为各种类型(或无论如何尝试)以查看哪些注册方法与 URL/provided 输入对。

我使用的是 VS 2010,对于 xml,这很简单,因为反序列化方法将 Type 作为参数。我有我试图实时匹配的类型。但是,对于 JSON 转换,该方法是模板化的(可能是通用的——我不太了解 c#,我通常是一个 c++ 人)。无论如何,我不能将变量放在编译时类型所在的类型 <> 表达式中。

此外,尽管 MSDN ( https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer(v=vs.100).aspx ) shows that the JavaScriptSerializer has a Deserialize(string, Type) method ( https://msdn.microsoft.com/en-us/library/ee191864(v=vs.100).aspx ),在 VS2010 中,该方法不存在。

当我右键单击并请求 "Go to Definition"

时出现的 JavaScriptSerializer 代码
#region Assembly System.Web.Extensions.dll, v4.0.30319
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Mono\System.Web.Extensions.dll
#endregion

using System;
using System.Collections.Generic;
using System.Text;

namespace System.Web.Script.Serialization
{
public class JavaScriptSerializer
{
    public JavaScriptSerializer();
    public JavaScriptSerializer(JavaScriptTypeResolver resolver);

    public int MaxJsonLength { get; set; }
    public int RecursionLimit { get; set; }

    public T ConvertToType<T>(object obj);
    public T Deserialize<T>(string input);
    public object DeserializeObject(string input);
    public void RegisterConverters(IEnumerable<JavaScriptConverter> converters);
    public string Serialize(object obj);
    public void Serialize(object obj, StringBuilder output);
}
}

我想做的是:

JavaScriptSerializer json_serializer = new JavaScriptSerializer();
obj payload = json_serializer.Deserialize(payloadStr, resource.PayloadType)

json 编码数据的实际类型存储在 resource.PayloadType 中,如果我打印出 resource.PayloadType.Name 我会发现它是正确的。但是,该 Deserialize 方法不存在(出于某种原因),我只剩下这个方法了。

JavaScriptSerializer json_serializer = new JavaScriptSerializer();
obj payload = json_serializer.Deserialize<resource.PayloadType>(payloadStr);

当然,这不会编译,因为您不能将变量放在编译时类型所在的位置。当我使用 DeserializeObject 进行转换时,我得到了某种通用字典 class 而不是我期望的类型,并且字典和我期望的类型之间没有转换。

MSDN网站有错吗?其他人在 .NET 4.0 中有 Deserialize 方法吗?我是否需要更新某些内容才能获得另一个补丁或其他内容?

我正在考虑将我的字符串转换为流并使用 DataContractJsonSerializer 进行转换,但我觉得我的设置可能有误或与 MSDN 网站冲突。或者是否有其他一些简单的方法可以将类型变量转换为要放入 <> 的类型?

MSDN 是正确的,VS2010 设置错误(设置为单声道而不是 .NET 4.0)。 Mono 2.10.8 显然没有完全实现 .NET 4 并且缺少该方法。

将每个项目的目标框架切换到 .NET Framework 4。可能必须删除对单目录 DLL 的引用,并在切换框架后重新添加它们。