这是我第一次使用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; }
}
答案 0 :(得分:3)
否,你绝对不应该使用RegExes或任何其他直接字符串操作来改变一些有效的JSON。
将JSON解析为对象图,并使用一些c#转换对象图以获得所需的结构。要执行转换,请考虑使用System.Linq
命名空间。
为什么?使用linq执行此操作更容易编写,更易于维护,并且不会充满与字符串操作相关的陷阱。更重要的是,现代JSON解析器已经付出了巨大努力,使它们变得可靠和快速。尝试执行特定任务的解析器的专门部分实现将不会从此工作中受益。
<强>买者强>
如果文件包含无效的JSON(例如,它不是JSON但接近),则可能需要进行字符串操作,JSON解析器可能与非JSON不兼容。
我可以设想一些非常专业的案例,其中正则表达式可能会提供性能优势,我必须对其进行测试。但是,这不适用于您的情况。
答案 1 :(得分:1)
如果您问题中的第一个结构是动态生成的(即不同数量的水果名称不断变化),那么
这个结构的设计师做得不好(这里不相关)
您可以通过令牌读取JSON文件令牌,然后解析 一些对象。这很好地支持了我的NewtonSoft的JSON库。