2

我正在尝试将一个多维的 JSON 字符串解析到应用程序中。这是字符串的片段:

{"one": {"Title": "There Goes the Musical Neighborhood", "Body": "On April 18th Public Enemy..."},"two": {"Title": "Public Enemys DJ Lord Tours Australia ”,“身体”:“公敌......

因此,正如您希望看到的那样,我有一个键(“one”),其值设置为第二个 JSON 字符串,键从“title”和“body”开始,每个都有自己的字符串值。

我用来输出字符串的 Web 服务可以在单个键值对中正常解析(例如 {"Title": "There Goes the Musical Neighborhood", "Body": "On April 18th Public Enemy..."}将解析字符串并将其存储到我创建的类中,因为我使用的是 Json.Net 并且能够简单地将键与类成员配对。

现在我需要将最多(但不一定全部)五个字符串解析到我的应用程序中以输出给用户。

我首先尝试解析第一个数组中的每个值(EX. {"one": {"Title": ...) 以便它存储的字符串将是一个我可以解析成它自己的对象的 JSON 字符串,但是当我运行我的代码时,它似乎返回了一个带有意外标记“one”的错误。

这是我解析它的方式。

        var request = HttpWebRequest.Create(string.Format(@"http://moon.eastlink.com/~jandrews/webservice2.php"));

        request.ContentType = "application/json";

        request.Method = "GET";



        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)

        {

            if (response.StatusCode != HttpStatusCode.OK)

                Console.Out.WriteLine("Error fetching data. Server returned status code: {0}", response.StatusCode);

            using (StreamReader reader = new StreamReader(response.GetResponseStream()))

            {

                var content = reader.ReadToEnd();

                if(string.IsNullOrWhiteSpace(content)) {

                    Console.Out.WriteLine("Response contained empty body...");

                }

                else {

                    Console.Out.WriteLine("Response Body: \r\n {0}", content);



                    NewsArray news = JsonConvert.DeserializeObject<NewsArray>(content);

在反序列化对象之前,我的响应是整个字符串都很好,并一次性输出到控制台,所以我知道流阅读器正在抓取字符串。但是,一旦它尝试反序列化对象,我就会收到错误“第 1 行位置 9 的令牌无效”。这可能与我如何转义字符串括号有关,但它在在线解析器中运行良好。该站点是我的完整字符串所在的位置,因此您可以查看。知道出了什么问题,或者是否有更好的方法来解决这个问题?

4

2 回答 2

0

此代码有效,但我认为该网站返回的 Json 有问题(请参阅我如何获得标题)

using (WebClient wc = new WebClient())
{
    string json = wc.DownloadString("http://moon.eastlink.com/~jandrews/webservice2.php");
    var jObj = JObject.Parse(json);

    var items = jObj.Children()
                .Cast<JProperty>()
                .Select(c => new
                {
                    Title = (string)c.Value["{\"Title"],
                    Body = (string)c.Value["Body"],
                    Caption = (string)c.Value["Caption"],
                    Datestamp = (string)c.Value["Datestamp"],
                })
                .ToList();
}
于 2013-06-14T19:42:38.387 回答
-1

根据您使用的 .NET 版本,您可以使用类似这样的东西

using System.Runtime.Serialization.Json;
public static T JsonDeserializer<T>(string jsonString)
    {
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));

        T obj = (T)ser.ReadObject(ms);
        return obj;
    }

然后使用该函数传入任何类型作为泛型类型

于 2013-06-14T18:56:00.317 回答