【问题标题】:Creating an array from JSON从 JSON 创建一个数组
【发布时间】:2013-06-11 12:13:10
【问题描述】:

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

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

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

我用来输出字符串的 Web 服务可以在单个键值对中正常解析 (EX. {"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 的令牌无效”。这可能与我如何转义字符串括号有关,但它在在线解析器中运行良好。该站点是我的完整字符串所在的位置,因此您可以查看。知道出了什么问题,或者是否有更好的方法来解决这个问题?

【问题讨论】:

    标签: c# android json multidimensional-array


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

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

    【讨论】:

    • 问题不在于我通常如何反序列化 json 字符串,而是如何序列化/解析链接中给出的 that json 字符串。你的班级会是什么样子(T)?顺便说一句,OP 使用 Json.Net 而不是 DataContractJsonSerializer
    • OP 声明“但是,一旦它尝试反序列化对象,我就会收到错误消息“第 1 行位置 9 处的令牌无效”。所以是的,他正在尝试反序列化一个字符串。解析 = 反序列化 = 将其分解为一个对象。使用简单的 C# 泛型,您可以像这样使用该类 var parsedObj = JsonDeserializer(originalJsonString);此外,DataContractJsonSerializer 是一个内置类,我相信它始于 .NET 4。
    • triad_Mike,不需要很多话,只需发布​​一个可用于反序列化该 json 字符串的类(+使用您的方法)然后我撤消我的反对票 + 赞成票
    • 我将使用您的示例: using (WebClient wc = new WebClient()) { string json = wc.DownloadString("moon.eastlink.com/~jandrews/webservice2.php"); var jObj = JsonDeserializer(json); }
    • triad_Mike,我还在等。你什么时候发布NewsArray 可以使用你的代码?
    【解决方案2】:

    此代码有效,但我认为网站返回的 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();
    }
    

    【讨论】:

    • 是的,正如我试图指出的那样,我添加了第二个括号并转义以尝试解析一个“字符串”,该字符串的格式类似于我可以单独解析的 Json 字符串。您在此处编写的代码是使用 System.Json 还是 Json.Net 引用?
    • 我删除了字符串开头的奇怪的东西,并将我的“一”键改回了一个数字,因为它应该在一个数组中。这很奇怪,但我现在收到一个错误,即没有 JProperty 的类型或命名空间,并且在当前上下文中找不到子项。非常抱歉在这里完成 n00b >.
    • 想通了。我使用了错误的参考(Newtonsoft.Json 而不是 Newtonsoft.Json.Linq 谢谢它现在工作得很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 2018-04-19
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多