C#中的Json反序列化

3

我正在尝试使用Json.NET反序列化Json字符串。我对此有基本的了解,但是我已经尝试了几天,但无法使其起作用,以下是我的代码(请忽略任何不必要/额外的代码,请记住,我根据研究结果尝试了多种解决方案)。

public class Location
{
    private string ab_;
    private int c_;
    public string name { get { return ab_; } set { value = ab_; } }
    public int woeid { get { return c_; } set { value = c_; } }
}

public class Trend
{
    private string x_, y_, z_;
    private object a_, b_;
    public string query { get { return x_; } set { value = x_; } }
    public string name { get { return y_; } set { value = y_; } }
    public object promoted_content { get { return a_; } set { value = a_; } }
    public string url { get { return z_; } set { value = z_; } }
    public object events { get { return b_; } set { value = b_; } }

}

public class RootObject
{
    private string o, l;
    private List<Location> list1;
    private List<Trend> list2;
    public List<Location> locations { get { return list1; } set { value = list1; } }
    public string created_at { get { return o; } set { value = o; } }
    public List<Trend> trends { get { return list2; } set { value = list2; } }
    public string as_of { get { return l; } set { value = l; } }
}
RootObject values = JsonConvert.DeserializeObject<RootObject>(jsonString)

现在我尝试反序列化的Json字符串是这样的:
 [
   {
      "as_of":"2012-08-31T15:31:55Z",
      "trends":[
         {
            "query":"%23GDTHATXX",
            "name":"#GDTHATXX",
            "promoted_content":null,
            "url":"http:\/\/twitter.com\/search\/?q=%23GDTHATXX",
            "events":null
         },
         {
            "query":"%23UnMundoEnElQue",
            "name":"#UnMundoEnElQue",
            "promoted_content":null,
            "url":"http:\/\/twitter.com\/search\/?q=%23UnMundoEnElQue",
            "events":null
         },
         {
            "query":"%23%C3%A7ekicibuluyorum",
            "name":"#\u00e7ekicibuluyorum",
            "promoted_content":null,
            "url":"http:\/\/twitter.com\/search\/?q=%23%C3%A7ekicibuluyorum",
            "events":null
         },
         {
            "query":"%22Darren%20Kenny%22",
            "name":"Darren Kenny",
            "promoted_content":null,
            "url":"http:\/\/twitter.com\/search\/?q=%22Darren%20Kenny%22",
            "events":null
         },
         {
            "query":"%22Richard%20Wright%22",
            "name":"Richard Wright",
            "promoted_content":null,
            "url":"http:\/\/twitter.com\/search\/?q=%22Richard%20Wright%22",
            "events":null
         },
         {
            "query":"Yossi",
            "name":"Yossi",
            "promoted_content":null,
            "url":"http:\/\/twitter.com\/search\/?q=Yossi",
            "events":null
         },
         {
            "query":"Filipinas",
            "name":"Filipinas",
            "promoted_content":null,
            "url":"http:\/\/twitter.com\/search\/?q=Filipinas",
            "events":null
         },
         {
            "query":"%22Javi%20Garc%C3%ADa%22",
            "name":"Javi Garc\u00eda",
            "promoted_content":null,
            "url":"http:\/\/twitter.com\/search\/?q=%22Javi%20Garc%C3%ADa%22",
            "events":null
         },
         {
            "query":"%22Van%20der%20Vaart%22",
            "name":"Van der Vaart",
            "promoted_content":null,
            "url":"http:\/\/twitter.com\/search\/?q=%22Van%20der%20Vaart%22",
            "events":null
         },
         {
            "query":"SSN",
            "name":"SSN",
            "promoted_content":null,
            "url":"http:\/\/twitter.com\/search\/?q=SSN",
            "events":null
         }
      ],
      "created_at":"2012-08-31T15:30:32Z",
      "locations":[
         {
            "name":"Globales",
            "woeid":1
         }
      ]
   }
]

因为类型要求JSON对象进行正确反序列化,所以无法将当前JSON数组(例如[1, 2, 3])反序列化为'Twitter.TrendParser + RootObject'类型。

要解决此错误,请将JSON更改为JSON对象(例如{"name":"value"}),或将反序列化的类型更改为数组或实现集合接口的类型(例如ICollection,IList),如可从JSON数组反序列化的List。JsonArrayAttribute也可添加到类型中以强制其从JSON数组反序列化。

路径'',行1,位置1。

正如我之前所说,我对Json格式有基本了解,并尝试使用不同类型的类进行反序列化,但结果相同,您有什么提示或任何关于问题可能是什么的想法吗?我还被困在.NET 2.0上,除了json.NET外没有第三方库。

感谢您的关注。

编辑 *

显然,即使我尝试声明List值,变量"value"也不会在实际上下文中创建,有什么方法可以解决这个问题。

2个回答

0

你的JSON是包含一个对象的数组。

这意味着JSON.NET将期望单个对象,但实际上得到了一个列表。错误消息基本上就是在告诉你这个。

试试这个:

List<RootObject> values = JsonConvert.DeserializeObject<List<RootObject>>(receiving);

尝试过这个,是我的错因为我没有提到,但它说值在实际上下文中不存在,尝试在构造函数中初始化它,但仍然没有任何结果。仍然尝试检查它,但在那之后它似乎没有任何值。有什么想法吗? - Edward Newgate
这通常意味着您尝试在代码后面使用变量values,即values == null。我会在DeserializeObject调用之后插入一个断点,看看是否有任何内容。这听起来不像是JSON.NET抛出的错误。 - James South
完成了,但是无论我如何声明这个变量,它似乎都无法识别。也许与编译器有关,但不确定,我看了汇编代码,也无法找出错误... 怪异。 - Edward Newgate
dynObj = (JArray)JsonConvert.DeserializeObject(nvm);对于dynObj中的每个JObject项, { 对于item["trends"]中的每个JObject趋势, { //Console.WriteLine("{0} - {1} - {2}", trend["query"], trend["name"], trend["url"]); arreglo = trend["name"]; } } - Edward Newgate
我使用了那个方法,现在它可以工作了,我将学习如何访问每个成员 =)。不过如果我能让另一种方法也起作用就很有趣了。 - Edward Newgate
显示剩余3条评论

-2

输入代码/// 类

公共类MambuData { 公共mambuData[] mambuDataS { 获取; 设置; } }

public class mambuData
{
    public string encodedKey { get; set; }
    public string id { get; set; }
    public DateTime creationDate { get; set; }
    public DateTime lastModifiedDate { get; set; }
    public string name { get; set; }
    public string phoneNumber { get; set; }
    public string emailAddress { get; set; }
}

///该方法

private string ParseMambuData(string streamResult) { string R = "";

        List<mambuData> mambuDataList = JsonConvert.DeserializeObject<List<mambuData>>(streamResult);

        foreach (mambuData m in mambuDataList)
        {
           //put data in db if you want

        }

        return R;

    }

这与问题(Json反序列化)有何关联? - mins
此解决方案将不会反序列化原始问题中的JSON数据。 - Brian Rogers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接