Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JavaScriptSerializer反序列化到嵌套对象_C#_Javascript_Serialization_Deserialization - Fatal编程技术网

C# JavaScriptSerializer反序列化到嵌套对象

C# JavaScriptSerializer反序列化到嵌套对象,c#,javascript,serialization,deserialization,C#,Javascript,Serialization,Deserialization,我有一个包含三个参数的对象(称为表达式):term1 operation term2,其中term1和term2是对象,operation是字符串。处理对象的逻辑可以处理term1或term2,它们是字符串或递归场景,其中它们包含嵌入式表达式 i、 e 当我尝试反序列化term1/term2是简单字符串的对象时,效果非常好,即 { term1: "foo", operation: "=", term2: "bar" } 将使用C#JavaScriptSerializer和以下代码正确反序列化:

我有一个包含三个参数的对象(称为表达式):term1 operation term2,其中term1和term2是对象,operation是字符串。处理对象的逻辑可以处理term1或term2,它们是字符串或递归场景,其中它们包含嵌入式表达式

i、 e

当我尝试反序列化term1/term2是简单字符串的对象时,效果非常好,即

{ term1: "foo", operation: "=", term2: "bar" }
将使用C#JavaScriptSerializer和以下代码正确反序列化:

    public T deserialize_json<T>(string json_string)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        return (T)serializer.Deserialize<T>(json_string);
    }
JavaScriptSerializer将term1和term2反序列化为
'System.Collections.Generic.Dictionary
2[System.String,System.Object]'`

有什么想法吗

我的方法调用很简单:

expression expr = deserialize<expression>(data);
expression expr=反序列化(数据);

您需要序列化有关term1和term2类型的信息。为此,您可以使用Newtonsoft.Json库

请尝试以下代码:

expression model = new expression() { term1 = new expression() { operation = " + " } };
string content = ModelManager<expression>.SaveToString(model);
/* content =
{
    "$type": "Test.expression, Test",
    "term1": {
    "$type": "Test.expression, Test",
    "operation": " + "
    }
}
*/
var model2 = ModelManager<expression>.LoadFromString(content);
string content2 = ModelManager<expression>.SaveToString(model2);
// content == content2 

public static class ModelManager<T>
{
    public static T LoadFromString(string content)
    {    
        using (var sr = new StringReader(content))
        using (var jr = new JsonTextReader(sr))
            return GetSerializer().Deserialize<T>(jr);
    }
    public static string SaveToString(T model)
    {
        StringBuilder sb = new StringBuilder(512);

        using (var sw = new StringWriter(sb, System.Globalization.CultureInfo.InvariantCulture))
        using (var jtw = new JsonTextWriter(sw))
            GetSerializer().Serialize(jtw, model);

        return sb.ToString();
    }

    private static Newtonsoft.Json.JsonSerializer GetSerializer()
    {
        return new Newtonsoft.Json.JsonSerializer()
        {
            NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
            DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include,
            TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects,
            TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple,
            Formatting = Formatting.Indented,
            MaxDepth = null,
            ReferenceLoopHandling = ReferenceLoopHandling.Error,
            PreserveReferencesHandling = PreserveReferencesHandling.None
        };
    }
}
expression model=new expression(){term1=new expression(){operation=“+”};
string content=ModelManager.SaveToString(model);
/*内容=
{
“$type”:“Test.expression,Test”,
“条款1”:{
“$type”:“Test.expression,Test”,
“操作”:“+”
}
}
*/
var model2=ModelManager.LoadFromString(内容);
字符串content2=ModelManager.SaveToString(model2);
//content==content2
公共静态类模型管理器
{
公共静态T LoadFromString(字符串内容)
{    
使用(var sr=新的StringReader(内容))
使用(var jr=新的JsonTextReader(sr))
返回GetSerializer()。反序列化(jr);
}
公共静态字符串SaveToString(T型)
{
StringBuilder sb=新的StringBuilder(512);
使用(var sw=newstringwriter(sb,System.Globalization.CultureInfo.InvariantCulture))
使用(var jtw=新的JsonTextWriter(sw))
GetSerializer().Serialize(jtw,模型);
使某人返回字符串();
}
私有静态Newtonsoft.Json.JsonSerializer GetSerializer()
{
返回新的Newtonsoft.Json.JsonSerializer()
{
NullValueHandling=Newtonsoft.Json.NullValueHandling.Ignore,
DefaultValueHandling=Newtonsoft.Json.DefaultValueHandling.Include,
TypeNameHandling=Newtonsoft.Json.TypeNameHandling.Objects,
TypeNameAssemblyFormat=System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple,
格式化=格式化。缩进,
MaxDepth=null,
ReferenceLoopHandling=ReferenceLoopHandling.Error,
PreserveReferencesHandling=PreserveReferencesHandling.None
};
}
}

Correction:它没有将term1显示为null,对于非嵌套的情况来说效果很好。嵌套案例的输出与之前相同。我对其进行了测试。你必须犯一些错误。请尝试使用我的测试示例(我刚才扩展了示例)。我无法在JSON中添加类型信息。那是。。。有点像一个非常糟糕的黑客。我不能使用它。除非您更改数据结构或提供自定义类型解析器,否则没有其他方法。您可以将term1和term2类型声明为:类MyTerm{public string Value{get;set;}公共字符串表达式{get;set;}。抱歉,它应该是:类MyTerm{public string Value{get;set;}公共表达式Exp{get;set;}。
expression expr = deserialize<expression>(data);
expression model = new expression() { term1 = new expression() { operation = " + " } };
string content = ModelManager<expression>.SaveToString(model);
/* content =
{
    "$type": "Test.expression, Test",
    "term1": {
    "$type": "Test.expression, Test",
    "operation": " + "
    }
}
*/
var model2 = ModelManager<expression>.LoadFromString(content);
string content2 = ModelManager<expression>.SaveToString(model2);
// content == content2 

public static class ModelManager<T>
{
    public static T LoadFromString(string content)
    {    
        using (var sr = new StringReader(content))
        using (var jr = new JsonTextReader(sr))
            return GetSerializer().Deserialize<T>(jr);
    }
    public static string SaveToString(T model)
    {
        StringBuilder sb = new StringBuilder(512);

        using (var sw = new StringWriter(sb, System.Globalization.CultureInfo.InvariantCulture))
        using (var jtw = new JsonTextWriter(sw))
            GetSerializer().Serialize(jtw, model);

        return sb.ToString();
    }

    private static Newtonsoft.Json.JsonSerializer GetSerializer()
    {
        return new Newtonsoft.Json.JsonSerializer()
        {
            NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
            DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include,
            TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects,
            TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple,
            Formatting = Formatting.Indented,
            MaxDepth = null,
            ReferenceLoopHandling = ReferenceLoopHandling.Error,
            PreserveReferencesHandling = PreserveReferencesHandling.None
        };
    }
}