【问题标题】:Proper Json deserialization正确的 Json 反序列化
【发布时间】:2012-08-28 11:24:26
【问题描述】:

好的,我会在这里尝试非常具体地解决我的问题。经过一些研究,我终于使我的代码工作(有点,因为它没有返回所需的结果)。我目前正在使用 JSON.net 并尝试反序列化以下 Json 字符串,该字符串是对 twitter API 的响应。

[{"created_at":"2012-09-03T18:22:54Z","locations":[{"name":"Globales","woeid":1}],"trends":[{"query":"%2327CosasSobreMi","name":"#27CosasSobreMi","promoted_content":null,"url":"http:\/\/twitter.com\/search\/?q=%2327CosasSobreMi","events":null},{"query":"%23AskTravis","name":"#AskTravis","promoted_content":null,"url":"http:\/\/twitter.com\/search\/?q=%23AskTravis","events":null},{"query":"%23WhyDoPeopleThinkItsOkayTo","name":"#WhyDoPeopleThinkItsOkayTo","promoted_content":null,"url":"http:\/\/twitter.com\/search\/?q=%23WhyDoPeopleThinkItsOkayTo","events":null},{"query":"%22We%20%3C3%20Justin%22","name":"We \u003C3 Justin","promoted_content":null,"url":"http:\/\/twitter.com\/search\/?q=%22We%20%3C3%20Justin%22","events":null},{"query":"%22We%20Adore%20One%20Direction%22","name":"We Adore One Direction","promoted_content":null,"url":"http:\/\/twitter.com\/search\/?q=%22We%20Adore%20One%20Direction%22","events":null},{"query":"%22Stefan%20Is%20Elena's%20Humanity%22","name":"Stefan Is Elena's Humanity","promoted_content":null,"url":"http:\/\/twitter.com\/search\/?q=%22Stefan%20Is%20Elena's%20Humanity%22","events":null},{"query":"%22Eric%20Saade%20Come%20Back%20To%20Poland%22","name":"Eric Saade Come Back To Poland","promoted_content":null,"url":"http:\/\/twitter.com\/search\/?q=%22Eric%20Saade%20Come%20Back%20To%20Poland%22","events":null},{"query":"Hlavackova","name":"Hlavackova","promoted_content":null,"url":"http:\/\/twitter.com\/search\/?q=Hlavackova","events":null},{"query":"%22Serena%20Williams%22","name":"Serena Williams","promoted_content":null,"url":"http:\/\/twitter.com\/search\/?q=%22Serena%20Williams%22","events":null},{"query":"%22Kire%C3%A7burnu%20%C3%87akallar%C4%B1%22","name":"Kire\u00e7burnu \u00c7akallar\u0131","promoted_content":null,"url":"http:\/\/twitter.com\/search\/?q=%22Kire%C3%A7burnu%20%C3%87akallar%C4%B1%22","events":null}],"as_of":"2012-09-03T18:25:18Z"}]

包含对象和东西的常规 Json 字符串...除了我不知道开头和结尾的第一个“[,]”是什么之外,一位朋友指出了这一点。现在我为那个 Json 字符串做了一些类:

public class Location
{
    private string _name;
    private int _woeid;

    public string name { get { return _name; } set { value = _name; } }
    public int woeid { get { return _woeid; } set { value = _woeid; } }
}

public class Trend
{
    private string _query, _name, _url;
    private object _promoted_content, _events;

    public string query { get { return _query; } set { value = _query; } }           
    public string name { get { return _name; } set { value = _name; } }
    public object promoted_content { get { return _promoted_content; } set { value = _promoted_content; } }
    public string url { get { return _url; } set { value = _url; } }
    public object events { get { return _events; } set { value = _events; } }

}

public class RootObject
{
    private List<Location> _locations;
    private List<Trend> _trends;
    private string created_at_, _as_of;

    public List<Trend> trends { get { return _trends; } set { value = _trends; } }         
    public string created_at { get { return created_at_;} set { value = created_at_; } }
    public string as_of { get { return _as_of ;} set { value = _as_of; } }
    public List<Location> locations { get { return _locations; } set { value = _locations; }}
}       

而我用来消除它的方法是这个:

WebClient client = new WebClient();
Stream stream = client.OpenRead(@"https://api.twitter.com/1/trends/1.json");
StreamReader reader = new StreamReader(stream);
string nvm = reader.ReadToEnd();
try
{
  List<RootObject> content = JsonConvert.DeserializeObject<List<RootObject>>(JsonString);
}
catch (System.Exception message)
{
    throw;
}

我只是无法确定我的类是否错误,因为变量内容始终为 Null,并且我无法像使用 Visual Studio 2005 那样更改抽象定义。尝试更改类中的列表但无法成功工作。

我在 StackOverflow 中尝试了所有不同响应的不同方法,但它们似乎都使用了一些我无法使用的方法,或者常规反序列化对它们有效。

【问题讨论】:

  • 提示:永远不要尝试/捕捉/抛出。只需删除 try/catch 即可获得相同的效果。
  • 是的,那里有一些错误处理逻辑,但我正在删除代码以使其简短明了。不过感谢您的提示。

标签: c# twitter visual-studio-2005 json.net deserialization


【解决方案1】:

您不需要任何这些类。只需使用dynamic

WebClient client = new WebClient();
string json = client.DownloadString("https://api.twitter.com/1/trends/1.json");

dynamic dynObj = JsonConvert.DeserializeObject(json);

foreach (var item in dynObj)
{
    foreach (var trend in item.trends)
    {
        Console.WriteLine("{0} - {1} - {2}",trend.query,trend.name,trend.url);
    }
}

编辑

没有dynamic的另一个版本

var dynObj = (JArray)JsonConvert.DeserializeObject(json);
foreach (var item in dynObj)
{
    foreach (var trend in item["trends"])
    {
        Console.WriteLine("{0} - {1} - {2}",trend["query"],trend["name"],trend["url"]);
    }
}

EDIT2

JArray dynObj = (JArray)JsonConvert.DeserializeObject(json);
foreach (JObject item in dynObj)
{
    foreach (JObject trend in item["trends"])
    {
        Console.WriteLine("{0} - {1} - {2}",trend["query"],trend["name"],trend["url"]);
    }
}

EDIT3

for (int i = 0; i < dynObj.Count;i++)
{
    for (int j = 0; j < ((JArray) dynObj[i]["trends"]).Count;j++ )
    {
        JObject trend = (JObject)((JArray)dynObj[i]["trends"])[j];
        Console.WriteLine("{0} - {1} - {2}", trend["query"], trend["name"], trend["url"]);
    }
}

【讨论】:

  • 我知道这种方法,但我使用的是旧版本的 C#,我相信“动态”语句不可用,有什么方法可以替换它?还是我没有使用正确的程序集引用?。
  • @EdwardNewgate 动态关键字随 Visual C# 2010 一起提供,请参阅编辑。
  • 感谢您提供这些方法,我仍然无法在 VS 2005 中使用 var,我知道它已经过时,但这些是此应用程序开发人员的要求,我知道您可以使用“标签”替换 var但不知道如何正确地做到这一点,我会尝试让代码与我所拥有的一起工作,但我可以使用这些编辑中的另一个。 =) 非常感谢您的宝贵时间。
  • 谢谢您,先生,它显然有效,我的最后一个问题是您是如何弄清楚它只能通过解析它才能工作的?我认为它必须反序列化才能访问 json 字符串中的对象成员。
  • @EdwardNewgate,我认为这被称为经验。
猜你喜欢
  • 2019-05-02
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多