【问题标题】:Json schema deserialization in C#C# 中的 Json 模式反序列化
【发布时间】:2013-11-26 08:32:12
【问题描述】:

我正在尝试反序列化如下所示的 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);

对象仍然是空的,令人失望...

【问题讨论】:

  • 请尝试..public string DID { get;放; }..在你所有的属性上

标签: c# json serialization jsonserializer


【解决方案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

【讨论】:

  • 嗯,是的,我知道问题出在嵌套对象上......我用一个简单的 JSON 尝试了它,就像你在上面写的那样......我如何只提取 DATA 字符串?谢谢!!
  • 另一种选择是将您的 DATA 类嵌套在另一个类中。
  • 好的,我设法将它反序列化为这样的动态对象: var dict = jsonSerializer.Deserialize(jsonString);现在我试图从对象中提取 CALLER_ID。当我这样尝试时: dict["DATA"]["CALLER_ID"] --- 我得到的结果是动态{string} 类型。如何将其转换为简单字符串??
【解决方案2】:

这是我反序列化 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!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多