【问题标题】:Parsing JSON using LINQ使用 LINQ 解析 JSON
【发布时间】:2023-03-22 10:28:01
【问题描述】:

您好,我面临一个非常简单的问题,但没有得到解决。这是我的班级设计

public class Program
{
    public string ProgramName { get; set; }
    public string ProgramTime { get; set; }
    public string ProgramDetails { get; set; }
}

public class Listing
{
    public string ChannelName { get; set; }
    public string NowShowing { get; set; }
    public string NowShowingTime { get; set; }
    public string NowShowingDescription { get; set; }
    public string NowShowingPicture { get; set; }
    public List<Program> Programs { get; set; }
}

public class RootObject
{
    public string status { get; set; }
    public string about { get; set; }
    public List<Listing> listings { get; set; }
}

我正在使用以下代码进行解析。

JObject json = JsonConvert.DeserializeObject(e.Result) as JObject;
Listing ls = new Listing
{
    ChannelName = (string)json["listings"].Children()["ChannelName"],
    NowShowing = (string)json["listings"].Children()["NowShowing"],
    Programs = new Program
    {
         ProgramName = (string)json["listings"]["Program"]["ProgramName"]
    }
};

帮我解决我蹩脚的方法。我关心的是正确解析项目以及如何将它们添加到嵌套列表“程序”中。第二个更为关键。

示例 Json 输入-

   {
      "listings": [
      {
          "ChannelName": "NTV BANGLA",
          "NowShowing": "Ei Shomoy (R)",
          "NowShowingTime": "12:10",
          "NowShowingDescription": "Ei Shomoy is a daily talk show ........",
          "Programs": [
          {
              "ProgramName": "Ainer Chokhe (R)",
              "ProgramTime": "13:00",
              "ProgramDetails": "Human Rights and law based program Ainer Chokhe,"
          },
          {
              "ProgramName": "Shonkhobash",
              "ProgramTime": "15:10",
              "ProgramDetails": "Drama serial Shonkhobash, script by Bipasha Hayat and"
          }
        ]
      },
      {
          "ChannelName": "CHANNEL i",
          "NowShowing": "Taroka Kothon (Live)",
          "NowShowingTime": "12:30",
          "NowShowingDescription": "City Cell Taroka Kothon Live is a talk show ",
          "Programs": [
          {
               "ProgramName": "Channel i Top News",
               "ProgramTime": "13:00",
               "ProgramDetails": "Mutual Trust Bank top news (Shirsho Shongbad)"
       },
       {
               "ProgramName": "Ebong Cinemar Gaan",
               "ProgramTime": "13:10",
               "ProgramDetails": "Ebong Cinemar Gaan, a musical show based on "
        }
 ]
         }
      ]
   }

EDIT1

var customers = JsonConvert.DeserializeObject<RootObject>(e.Result);
Listing ls = new Listing
{
       ChannelName = customers.listings.First().ChannelName,
       NowShowing=customers.listings.First().NowShowing,
       Programs=??
};

【问题讨论】:

  • 你必须遍历嵌套数组来创建你的Programs
  • 能否提供示例 json 供输入?
  • 您的示例 json 解析代码没有运行时错误?
  • 您能否为您的 json 输入提供示例预期输出?

标签: c# json linq windows-phone-8


【解决方案1】:

如果e.Result 是你的 JSON 字符串,试试这个

var jss = new JavaScriptSerializer();
var o = jss.Deserialize<RootObject>(e.Result);

更新
可能你需要这样的东西

var customers = JsonConvert.DeserializeObject<RootObject>(e.Result);
Listing ls = new Listing
{
    ChannelName = customers.listings.First().ChannelName,
    NowShowing=customers.listings.First().NowShowing,
    Programs=customers.listings.First().Programs
};

更新2
如果你想基于现有的,你可以尝试这样的事情

var customers = JsonConvert.DeserializeObject<RootObject>(e.Result);
Listing ls = new Listing
{
    ChannelName = customers.listings.First().ChannelName,
    NowShowing=customers.listings.First().NowShowing,
    Programs=customers.listings.First().Programs.Select(p=>new Program{
                                        ProgramName=p.ProgramName,
                                        ProgramTime=p.ProgramTime, 
                                        ProgramDetails = p.ProgramDetails
                                       }).ToList()
};

UPDATE3
或者如果你想要简单的随机,你可以尝试这样的事情

var customers = JsonConvert.DeserializeObject<RootObject>(e.Result);
Listing ls = new Listing
{
    ChannelName = customers.listings.First().ChannelName,
    NowShowing=customers.listings.First().NowShowing,
    Programs=Enumerable.Range(1,10).Select(p=>new Program{
                                        ProgramName="generated name",
                                        ProgramTime="generated time", 
                                        ProgramDetails = "generated details"
                                       }).ToList()
};

【讨论】:

  • 对不起,我无法正确表达自己,我手中有数据,我想将它们分配给正确的属性以供以后使用。如何填充 ChannelName、NowShowing 和最重要的嵌套数组程序?
  • 我不太明白你的意思,在o 中,你已经反序列化了具有归档属性的对象,包括List&lt;Listing&gt;,List&lt;Program&gt;,所以你可以简单地得到它并改变,你能提供采样你的具体意思是什么?
  • 我已经解决了我的问题的第一部分(我会在我的回答中详细说明)。请告诉我如何将数据插入“程序”?我遇到了麻烦,因为它是一个列表,而不是像“ChannelName”或“NowShowing”这样的属性
  • 这是正确的做法。但我也需要 "ProgramName"、"ProgramTime"、"ProgramDetails" 中的值。
  • 有一些转换问题。已引发 IEnumerable 到 Generic 的转换错误。
【解决方案2】:

在 windows phone 中使用 DataContractJsonSerializer 解析 json 字符串。

MemoryStream memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(e.Result));

DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(List<RootObject>));
RootObject itemDataList = dataContractJsonSerializer.ReadObject(memoryStream) as RootObject;

ChannelName = itemDataList.listings.First().ChannelName;

【讨论】:

  • 表示路径中有非法字符
  • 不幸的是,itemdatalist 仍然为空。我错过了什么吗?
  • 我在我的 ans 中进行了编辑,请检查它并告诉我它是否有效
  • JObject json = JsonConvert.DeserializeObject(e.Result) 作为 JObject;我从这里获取我的 json 数据。问题在于解析和迭代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多