这是我的JSON:
{
"Name": "Eli",
"Age": 4,
"Children": {
"Moshe": {
"Age": 6,
"Characteristics": "Nice;Good;"
},
"Yossi": {
"Age": 3,
"Characteristics": "Hero;Brave"
}
}
}
这是我的JSON反序列化功能:
public static object FromJSON<T>(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<Person>(output);
我得到例外说法:
反序列化JSONSerialization.Person类型的对象时出错。结束元素&#39; item&#39;来自命名空间&#39; item&#39;预期。找到元素&#39; a:item&#39;来自命名空间&#39; item&#39;。
只是为了澄清:我不希望解析子子字段。
答案 0 :(得分:0)
如果您使用JavaScriptSerializer,那么您将能够将Children键序列化为动态字段,并在需要时以JSON格式读取它。
在Person
对象中,尝试使用dynamic
类型而不是string
属性{/ 1}}。
Children
您可以使用以下方法
public static T FromJavaScriptSerializer<T>(string json)
{
var serializer = new JavaScriptSerializer();
return serializer.Deserialize<T>(json);
}
public static string ToStringOutput(object dynamicField)
{
var serializer = new JavaScriptSerializer();
return serializer.Serialize(dynamicField);
}
以下内容将出现在控制台
中{ “摩西”:{ “年龄”:6中, “特性”: “好,良好;”}, “贝纳”:{ “年龄”:3 “特性”: “英雄;勇敢”}} < / p>
答案 1 :(得分:-1)
在反序列化https://dotnetfiddle.net/GWs69U
之前,使用Regex
将Children
转换为字符串(添加引号,用\ n替换新行)
string result = Regex.Replace(json, @"(\""Children\""\:(.|\n)*?)(\{(.|\n)*\{(.|\n)*?\}(.|\n)*?\})", (m) =>
{
return (m.Groups[1] + "\"" + Regex.Replace(m.Groups[3].Value.Replace("\n", " "), @"\s+", " ") + "\"");
});