从JSON创建数组

时间:2013-06-14 18:50:52

标签: c# android json multidimensional-array

我正在尝试将应用程序解析为多维的JSON字符串。这是剪辑字符串:

{“one”:{“Title”:“那里有音乐社区”,“身体”:“4月18日公敌......”},“两个”:{“Title”:“公共Enemys DJ Lord Tours Australia“,”Body“:”Public Enemys ......

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

我用来输出字符串的web服务可以在SINGLE键值对中进行精细解析 (EX。{“Title”:“有去音乐社区”,“身体”:“4月18日公敌......”}将解析并将字符串存储到我创建的类中,因为我使用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位的无效令牌”。它可能与我如何转义字符串括号有关,但它在在线解析器中工作正常。该网站是我的完整字符串,所以你可以看看。知道什么是错的,或者是否有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:-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;
    }

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