C# JavaScriptSerializer反序列化到嵌套对象
我有一个包含三个参数的对象(称为表达式):term1 operation term2,其中term1和term2是对象,operation是字符串。处理对象的逻辑可以处理term1或term2,它们是字符串或递归场景,其中它们包含嵌入式表达式 i、 e 当我尝试反序列化term1/term2是简单字符串的对象时,效果非常好,即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: "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
};
}
}