有效的 JSON 文件但结构错误?(Json.NET)



这是我第一次使用JSON。我必须从我没有输入的 JSON 文件中读取对象(结构/格式)。我一直在使用 http://json2csharp.com/来了解我可以从中获得哪些对象。根据下面的示例,此文件中的结构是否不好?我已经更改了示例中的实际字段名称,否则结构与我必须从中读取的文件相同。有数百个这样的对象(水果),而且还会更多。在解析 JSON 文件之前,我应该使用 RegExp 来获得更好的 JSON 结构吗?

原始文件:

{
"FRUITS": {
    "BANANA": {
        "category"      : "FRUITS",
        "fruit_type"    : "Peelable",
        "description"   : "Yellow soft fruit",
        "identifier"    : "BANANA",
        "attributes": [ {
                "description"   : "hardness",
                "value"         : 3
            }, {
                "description"   : "smell",
                "strength"      : 1,
                "max_value"     : 10
            }, {
                "argument"      : "PRESS",
                "description"   : "Press fruit",
                "strength"      : 2
        } ],
        "physical_type": "yellow"
    },
    "APPLE": {
        "category"      : "FRUITS",
        "fruit_type"    : "Peelable",
        "description"   : "Red hard fruit",
        "identifier"    : "APPLE",
        "attributes"    : [ {
                "description"   : "hardness",
                "value"         : 10
            }, {
                "description"   : "smell",
                "strength"      : 1,
                "max_value"     : 10
            }, {
                "argument"      : "PRESS",
                "description"   : "Press fruit",
                "strength"      : 2
        } ],
        "physical_type" : "red"
    }
}

}

生成的类包括:

        public class Attribute
    {
         public string description { get; set; }
         public int value { get; set; }
         public int? strength { get; set; }
         public int? max_value { get; set; }
         public string argument { get; set; }
    }
    public class BANANA
    {
         public string category { get; set; }
         public string fruit_type { get; set; }
         public string description { get; set; }
         public string identifier { get; set; }
         public List<Attribute> attributes { get; set; }
         public string physical_type { get; set; }
    }
    public class Attribute2
    {
         public string description { get; set; }
         public int value { get; set; }
         public int? strength { get; set; }
         public int? max_value { get; set; }
         public string argument { get; set; }
    }
    public class APPLE
    {
         public string category { get; set; }
         public string fruit_type { get; set; }
         public string description { get; set; }
         public string identifier { get; set; }
         public List<Attribute2> attributes { get; set; }
         public string physical_type { get; set; }
    }
    public class FRUITS
    {
         public BANANA BANANA { get; set; }
         public APPLE APPLE { get; set; }
    }
    public class RootObject
    {
         public FRUITS FRUITS { get; set; }
    }

如果我将其更改为:

{
"FRUITS": [{        
        "category"      : "FRUITS",
        "fruit_type"    : "Peelable",
        "description"   : "Yellow soft fruit",
        "identifier"    : "BANANA",
        "attributes": [ {
                "description"   : "hardness",
                "value"         : 3
            }, {
                "description"   : "smell",
                "strength"      : 1,
                "max_value"     : 10
            }, {
                "argument"      : "PRESS",
                "description"   : "Press fruit",
                "strength"      : 2
        } ],
        "physical_type": "yellow"
    },{
        "category"      : "FRUITS",
        "fruit_type"    : "Peelable",
        "description"   : "Red hard fruit",
        "identifier"    : "APPLE",
        "attributes"    : [ {
                "description"   : "hardness",
                "value"         : 10
            }, {
                "description"   : "smell",
                "strength"      : 1,
                "max_value"     : 10
            }, {
                "argument"      : "PRESS",
                "description"   : "Press fruit",
                "strength"      : 2
            } ],
            "physical_type" : "red"
    }]  

}

我得到以下课程:

        public class Attribute
    {
         public string description { get; set; }
         public int value { get; set; }
         public int? strength { get; set; }
         public int? max_value { get; set; }
         public string argument { get; set; }
    }
    public class FRUIT
    {
         public string category { get; set; }
         public string fruit_type { get; set; }
         public string description { get; set; }
         public string identifier { get; set; }
         public List<Attribute> attributes { get; set; }
         public string physical_type { get; set; }
    }
    public class RootObject
    {
         public List<FRUIT> FRUITS { get; set; }
    }

,您绝对不应该使用正则表达式或任何其他直接字符串操作来改变一些有效的 JSON。

将 JSON 解析为对象图,并使用一些 c# 转换对象图以获取所需的结构。若要执行转换,请考虑使用 System.Linq 命名空间。

为什么?使用 linq 执行此操作更易于编写、更易于维护,并且不会充满与字符串操作相关的陷阱。更重要的是,现代JSON解析器已经投入了大量精力,以使其可靠和快速。尝试对解析器的专用部分实现来执行特定任务将不会从这项工作中受益。


警告

如果文件包含无效的 JSON(例如,它不是 JSON 但接近),则可能需要字符串操作,JSON 解析器可能与非 JSON 不兼容。

我可以设想一些非常专业的情况,其中正则表达式可能会提供性能优势,我必须对其进行测试。但是,这不适用于您的情况。

如果你的问题中的第一个结构是动态产生的(即,有不同数量的水果,名称不断变化),那么

  1. 这个结构的设计者做得不好(这里无关紧要)

  2. 您可以逐个令牌读取 JSON 文件令牌并将其解析为一些对象。这很好地支持了我的NewtonSoft的JSON库。

相关内容

  • 没有找到相关文章

最新更新