C#中的Json模式反序列化

时间:2013-11-13 16:16:59

标签: c# json serialization jsonserializer

我正在尝试反序列化看起来像这样的JSON:

{"METHOD":"GET_IVR_ACTION",
 "DATA":   {"DID":"972732248673",
            "CALLER_ID":"972508822570",
            "CALLER_NAME":null,
            "IVR_UNIQUE_ID":"4c80c29146c61f3c24ed434e11cb340b",
            "DTMF":"",
            "MENU":"-1",
            "PREVIOUS_MENU":"-1"}
}

进入这个类对象:

public class DATA
{
    public string DID = string.Empty;
    public string CALLER_ID = string.Empty;
    public string CALLER_NAME = string.Empty;
    public string IVR_UNIQUE_ID = string.Empty;
    public string DTMF = string.Empty;
    public string MENU = string.Empty;
    public string PREVIOUS_MENU = string.Empty;
}

使用JavaScriptSerializer:

JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
DATA data = jsonSerializer.Deserialize<DATA>(jsonString);

对象仍然令人失望地空着......

2 个答案:

答案 0 :(得分:1)

好吧,JSON字符串有一个嵌套对象。 JavaScriptSerializer或基本上任何其他JSON序列化工具都使用反射来逐个映射属性和属性。

您应首先提取Data字符串,然后将其用作Deserialize方法的参数。

尝试测试:

        {
           "DID":"972732248673",
           "CALLER_ID":"972508822570",
           "CALLER_NAME":null,
           "IVR_UNIQUE_ID":"4c80c29146c61f3c24ed434e11cb340b",
           "DTMF":"",
           "MENU":"-1",
           "PREVIOUS_MENU":"-1"
        }

要获得Data部分,您有两种选择:

  1. 使用JavaScriptDeserializer,但将结果分配给动态对象(非强类型)。在这种情况下,反序列化器使用其类型解析器来查找嵌套类型,并为您提供完整的对象图(对象层次结构)

  2. 使用正则表达式获取Data对象JSON

答案 1 :(得分:0)

这是我反序列化JSON的方法:

    public static bool CreateJson(ref Dictionary<string, object> values, string source)
    {
        bool result = false;
        if (!string.IsNullOrEmpty(source))
        {
            var serializer = new JavaScriptSerializer();
            object json = serializer.DeserializeObject(source);
            values = json as Dictionary<string, object>;
            result = values != null;
        }

        return result;
    }

请注意,它会创建一个Dictionary并返回它。然后,您可以(在调试器中)浏览该结果并查看其中的值。然后你可以找出从中获取所需值的正确方法。每次都适合我。

HTH!