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

时间:2015-02-02 13:45:57

标签: c# json deserialization

这是我的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;。

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

2 个答案:

答案 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

之前,使用RegexChildren转换为字符串(添加引号,用\ 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+", " ") + "\"");
});