【问题标题】:Parsing json file to get out data解析json文件以获取数据
【发布时间】:2019-07-04 11:16:31
【问题描述】:

在 c# 中使用带有以下 nuget 包的 winforms

WindowsAPICodePack-Shell //used for old style folder dialog
Newtonsoft.Json

我有一个具有以下结构的文件文件夹

{
    "modelName": "3K05",
    "Fridge":  
    { 
    "color" : "white",
    "comment" : "sell at discount",  
    "version" : 1,  
    "date" : 20171102,  
    "features" : 264, 
    "purpose" : "Generic",  
    "format" : [1,5,10,0],  
    "build" : [[0,0,0,0,0,0], 
    [22,0,0,20,0,0], 
    [0,30,0,0,0,0], 
    [26,0,0,31,0,90], 
    [0,0,33,0,0,0], ]
    }  
    }

然后我尝试使用以下代码解析以获取一些信息

foreach (string filename in Directory.GetFiles(dialog.FileName))
                {
                   if (Path.GetExtension(filename) == ".APP") //name of json files
                   {
                       using (StreamReader r = new StreamReader(filename)) //read infile
                       {
                         dynamic array = JsonConvert.DeserializeObject(r.ReadToEnd()); //put into json array
                         foreach (var item in array) //parse thru array
                         {
                             if (item.modelName != null) listBox1.Items.Add(item.modelName); else listBox1.Items.Add("empty"); // get modelName

                             if (item.Fridge != null) listBox1.Items.Add(item.Fridge.color); else listBox1.Items.Add("empty"); //get color

                             if (item.Fridge != null) listBox1.Items.Add(item.Fridge.format); else listBox1.Items.Add("empty"); //get the string inside []

                             if (item.Fridge != null) listBox1.Items.Add(item.Fridge.build); else listBox1.Items.Add("empty"); //get second item as string [[ ] [ 2nd]]
                            }
                       }                       
                   }
                }

第一个问题是,除非我将数据括在方括号 [] 中,否则我无法进行任何工作。那么如何在没有方括号的情况下使其工作呢?

我的工作数据是

[
{
"modelName": "3K05",
"Fridge":  
{ 
"color" : "white",
"comment" : "sell at discount",  
"version" : 1,  
"date" : 20171102,  
"features" : 264, 
"purpose" : "Generic",  
"format" : [1,5,10,0],  
"build" : [[0,0,0,0,0,0], 
[22,0,0,20,0,0], 
[0,30,0,0,0,0], 
[26,0,0,31,0,90], 
[0,0,33,0,0,0], ]
}  
} 
]

第二个问题是我现在如何从构建和格式中获取信息。从构建中我希望能够将第二项作为字符串获取?

22,0,0,20,0,0

目前它以收藏的形式出现。如果有返回白色的 Fridge.color,我可以看到如何进入第一个,但是我如何进入 Fridge.build.?


我是如何让我的工作得到答案的,所以感谢所有回答的人。

我学习了 VS 的一个新部分,即编辑 -> 选择性粘贴 -> 将 Json 粘贴为类

然后我把它当作

var myObject = JsonConvert.DeserializeObject<Rootobject>(File.ReadAllText(@filename)); 

myObject.xxxx.yyyyy;

xxxx = Json 类的 Rootobject 实例 yyyy = Json 类中的项目。我就是这么理解的,但我用的词可能不正确。

这样做还向我展示了构建信息只是一个二维数组,我很乐意使用它。

再次感谢这个网站,我学到了更多关于 C# 的知识

【问题讨论】:

  • 对于您的第一个问题,您的 JSON 无效,请将 [0,0,33,0,0,0], 替换为 [0,0, 33,0,0,0]。另外,请不要使用 dynamic ,请阅读 documentation 如果您将 json 映射到类中,这将帮助您解决第二个问题,您可以使用 this tool 轻松做到这一点(编辑)如果您构建结构如何工作,您可以将其映射到另一个子类
  • 第一个问题:您正在使用 foreach 遍历您的动态对象,因此它需要来自 json 的数组,因此您必须将 json 包装在 [ ] 括号内。

标签: c# json parsing json.net


【解决方案1】:

使用Json2CSharp,以下类为您的 json 建模。

public class Fridge
{
    public string color { get; set; }
    public string comment { get; set; }
    public int version { get; set; }
    public int date { get; set; }
    public int features { get; set; }
    public string purpose { get; set; }
    public List<int> format { get; set; }
    public List<List<int>> build { get; set; }
}

public class RootObject
{
    public string modelName { get; set; }
    public Fridge Fridge { get; set; }
}

请注意,您也可以在 Visual Studio 中执行此操作,只要您的 json 字符串有效。只需转到编辑->选择性粘贴..

然后您可以按如下方式消费:

var myObject=JsonConvert.DeserializeObject<RootObject>();
//get the format list
var formats=myObject.Fridge.format;
var build=myObject.Fridge.build;

【讨论】:

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