C# 使用.NET中的JavaScriptSerializer将内部结构反序列化为字符串

C# 使用.NET中的JavaScriptSerializer将内部结构反序列化为字符串,c#,.net,json,javascriptserializer,C#,.net,Json,Javascriptserializer,我正在使用.NET中的JavaScriptSerializer对结构进行反序列化,这些结构可以是您的标准平面键/值对,如下所示: { "Value": 3.14, "Type": "Real" } { "Value": { "something": "test" }, "Type": "JsonData" } 或者更复杂,具有如下内部分层值对象: { "Value": 3.14, "Type": "Real" } { "Value":

我正在使用.NET中的
JavaScriptSerializer
对结构进行反序列化,这些结构可以是您的标准平面键/值对,如下所示:

{
    "Value": 3.14,
    "Type": "Real"
}
{
    "Value": { "something": "test" },
    "Type": "JsonData"
}
或者更复杂,具有如下内部分层值对象:

{
    "Value": 3.14,
    "Type": "Real"
}
{
    "Value": { "something": "test" },
    "Type": "JsonData"
}
我遇到的问题是,对于
“Type”:“JsonData”
,对象可以是任意的。我不能对它的结构做任何假设

但是,我的应用程序的“上层”将知道如何处理这些数据

因此,我需要找到一种方法,使字段保持为字符串,无论它是包含整数、字符串还是完整的JSON结构。基本上,我不希望
JavaScriptSerializer
解析其中的任何内容。我希望能够有这样一门课:

public class JsonObject
{
    public string Value { get; set; }
    public string Type { get; set; }
}
Value
包含我的JSON中未处理的普通值

有没有办法告诉.NET不要解析我的JSON的某些部分?

请不要建议使用其他库,如JSON.NET。我知道它可能能够做到这一点,但这是针对一个将作为库分发的项目——这就是为什么我希望我的库只依赖于标准的.NET framework。

尝试一下:

public class JsonObject
{
    public object Value { get; set; }
    public object Type { get; set; }
}

没有一个属性指示
JavaScriptSerializer
不解析特定的JSON属性(除了完全忽略它,这不是您想要的)。但是,您可以创建一个
JavaScriptConverter
,它将有效地重新序列化所讨论的属性,这样您仍然可以得到您想要的结果:所有值最终都是字符串

以下是转换器的外观:

public class JsonObjectConverter : JavaScriptConverter
{
    public override IEnumerable<Type> SupportedTypes
    {
        get { return new List<Type> { typeof(JsonObject) }; }
    }

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        JsonObject obj = new JsonObject();
        obj.Type = (string)dictionary["Type"];
        obj.Value = serializer.Serialize(dictionary["Value"]);
        return obj;
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
输出:

(String) "foo bar"
(Real) 3.14
(JsonData) {"Something":"Test","Items":["A","B","C"]}
(Integer) 42

我必须说,JSON.Net是可用的最好的
JSON
解析库。我知道,而且我在许多其他项目中使用过很多次:)但是,对于我的项目来说,它完全是多余的,我真的必须使用标准的.Net运行时提供的东西,仅此而已!ASP.NET MVC也使用Json.NET,这应该可以满足需求。“作为库”的要求并不意味着不能使用Json.NET。这并不过分,它比过时的JavaScriptSerializer更简单、更容易、更兼容?您不能简单地反序列化到您提供的类型吗?您尝试过什么?问题是什么?@PanagiotisKanavos“我的问题是,在“Type”的情况下:“JsonData”,对象可以是任意的。我不能对其结构做任何假设。”谢谢,我已经尝试过了,是的,它反序列化正确。然而,我的问题是我确实需要
Value
成为字符串,而不是
对象。这就是我的代码的上半部分所期望的!你的要求有点奇怪。加上
和“Value”:3.14
Value
不是
字符串。我知道它不是字符串。我想说的是,上层将知道如何处理
“3.14”
“Hello\”
那么,他们可能也知道
对象。感谢您的解决方案!在此期间,我决定按照您的建议重新序列化。但是没有转换器。不过,您的解决方案有点干净!