【问题标题】:C# Parsing Json File with no nameC#解析没有名称的Json文件
【发布时间】:2012-07-06 00:00:15
【问题描述】:

所以,部分Json文件是这样的:

{
"number":"23",
"name":{
    "":"LJames"   <----------- look at this line
},
"Gender":"Male",
...

我正在尝试解析这个,只要名称字段存在(没有名称与值匹配),DataContractJsonSerializer 将无法读取它。

任何有这种Json文件经验的人请分享一些想法,谢谢。

【问题讨论】:

  • 问题不是你的解析器。它是您的源数据。

标签: c# json silverlight parsing


【解决方案1】:

您可以尝试使用Json.NET 来解析它。它通常比 DataContractJsonSerializer 工作得更好,并且具有更好的性能。不过,我不确定这是否能解决您的问题。

如果你想一想,在 C# 中生成的对象会是什么样子?从这样的 JSON 字符串...

{
     "name" : { "first" : "James" }
}

...我希望映射到具有“name”属性的 C# 对象,并且该“name”属性将引用具有“first”属性的对象(这将是一个字符串,值为“詹姆斯”)。

因此,如果您删除键值“first”,解析器将如何知道如何映射(或如何命名)属性? C# 中没有无名属性。

我建议将您的 Json 文件(如果可能)重新格式化为如下所示:

{
    "number":"23",
    "name": "LJames",
    "Gender":"Male",
    ...

【讨论】:

  • +1。编写创可贴来修复源数据总是会带来更多创可贴。
  • +1 和最佳答案。我通过简单地将Json文件中的所有""替换为"undefinedField"之类的东西并解析它来解决这个问题。
  • @AllanJiang,警告您不要替换所有""。如果你这样做,你可以用那个“undefinedField”替换一个属性值(不是名字)。我想您应该尝试将""(any number of spaces): 替换为"undefinedField" :
【解决方案2】:

使用正则表达式将此空引号替换为您选择的变量名称,例如:

  json = Regex.Replace(json , "\"\":", "\"playerName\":", RegexOptions.IgnorePatternWhitespace);

【讨论】:

    【解决方案3】:

    对于CC++,有一个名为jansson 的库。我对C# 不熟悉,但也没有理由不在那里工作。但是,如果你想自己创建一个解析器,我会告诉你,写一个正则表达式作为你的分隔符: 例如 String delim = "{} :\n\t"; 您的解析器基本上是:如果: 在线,则检索值作为keyvalue 对,如果{ 继续解析直到找到}。 我怀疑您在编写这样的解析器时会遇到任何麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 2023-03-25
      • 1970-01-01
      • 2020-01-08
      • 2021-11-24
      • 2020-03-28
      • 1970-01-01
      相关资源
      最近更新 更多