使用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 “特性”: “英雄;勇敢”}}
在反序列化之前使用Regex
将Children
转换为字符串(添加引号,用\ 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+", " ") + "\""); });