使用C#中的DataContractJsonSerializer将子字段作为字符串反序列化JSON对象

这是我的JSON:

{ "Name": "Eli", "Age": 4, "Children": { "Moshe": { "Age": 6, "Characteristics": "Nice;Good;" }, "Yossi": { "Age": 3, "Characteristics": "Hero;Brave" } } } 

这是我的JSON反序列化function:

 public static object FromJSON(string json) { using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(json))) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); return serializer.ReadObject(stream); } } 

我正在尝试将其序列化为Person对象:

 [DataContract] public class Person { [DataMember] public int Age; [DataMember] public string Name; [DataMember] public string Children; } 

正如你所看到的,我不想让Children进入字典,而是按原样获取它 – JSON字符串。

目前我这样做:

 Person p = (Person)Extensions.FromJSON(output); 

我得到例外说:

反序列化JSONSerialization.Person类型的对象时出错。 期望命名空间“item”中的结束元素“item”。 在命名空间’item’中找到元素’a:item’。

只是为了澄清:我不希望解析子子字段。

如果您使用JavaScriptSerializer,那么您将能够将Children键序列化为动态字段,并在需要时以JSON格式读取它。

Person对象中,尝试使用dynamic类型而不是Children属性的string

 public static T FromJavaScriptSerializer(string json) { var serializer = new JavaScriptSerializer(); return serializer.Deserialize(json); } public static string ToStringOutput(object dynamicField) { var serializer = new JavaScriptSerializer(); return serializer.Serialize(dynamicField); } 

您可以使用以下方法

 var person = FromJavaScriptSerializer(output); Console.WriteLine(ToStringOutput(person.Children)); 

以下内容将出现在控制台中

{ “摩西”:{ “年龄”:6中, “特性”: “好,良好;”}, “贝纳”:{ “年龄”:3 “特性”: “英雄;勇敢”}}

在反序列化之前使用RegexChildren转换为字符串(添加引号,用\ n替换新行) https://dotnetfiddle.net/GWs69U

 string result = Regex.Replace(json, @"(\""Children\""\:(.|\n)*?)(\{(.|\n)*\{(.|\n)*?\}(.|\n)*?\})", (m) => { return (m.Groups[1] + "\"" + Regex.Replace(m.Groups[3].Value.Replace("\n", " "), @"\s+", " ") + "\""); });