有效的JSON文件但结构不好? (Json.NET)

时间:2015-01-28 08:31:12

标签: c# json json.net structure

这是我第一次使用JSON。我必须从JSON文件中读取对象,我没有输入(结构/格式)。我一直在使用http://json2csharp.com/来了解我可以从中获得哪些对象。 根据以下示例,此文件中的结构是否错误? 我已经更改了示例中的实际字段名称,否则与我必须读取的文件相同。有数百个这些对象(FRUITS),还有更多。 在解析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; }
    }

2 个答案:

答案 0 :(得分:3)

,你绝对不应该使用RegExes或任何其他直接字符串操作来改变一些有效的JSON。

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

为什么?使用linq执行此操作更容易编写,更易于维护,并且不会充满与字符串操作相关的陷阱。更重要的是,现代JSON解析器已经付出了巨大努力,使它们变得可靠和快速。尝试执行特定任务的解析器的专门部分实现将不会从此工作中受益。


<强>买者

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

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

答案 1 :(得分:1)

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

  1. 这个结构的设计师做得不好(这里不相关)

  2. 您可以通过令牌读取JSON文件令牌,然后解析 一些对象。这很好地支持了我的NewtonSoft的JSON库。