首页 > 解决方案 > 在 C# 中迭代​​和解析 JSON 字符串时,有没有办法知道哪个是最后一个标记?

问题描述

我正在解析字符串上的一些 JSON 数据,以将其传递给具有自定义格式的文件。但我需要知道哪个是文件的最后一个标记,以便我用“}”而不是“}”关闭标签(也就是说,没有逗号,语法正确)。

我尝试使用该Last属性获取最后一个令牌,但它并没有像我想象的那样工作。

这是我用来解析数据和写入文件的函数(它还将所需的数据打印到终端,但不是 JSON 数据,这就是我首先解析它的原因):

private static void ParseData()
        {
            JObject jsonData;

            try
            {
                using (StreamWriter file = new StreamWriter(Globals.dataFile))
                {
                    file.WriteLine("{");

                    jsonData = JObject.Parse(Globals.json);
                    Console.WriteLine("*********************************************");
                    foreach (JToken tokens in jsonData["indicator"]["values"])
                    {
                        Console.WriteLine("Fecha y hora: " + tokens["datetime"] + " Valor: " + tokens["value"] + Environment.NewLine + "*********************************************");
                        file.Write(Environment.NewLine + "\t{" + Environment.NewLine + "\t\t\"datetime\": " + tokens["datetime"] + ",");
                        file.WriteLine("\t\t\"value\": " + tokens["value"]);
                        if (tokens != tokens.Last)
                        {
                            file.WriteLine("\t},");
                            Console.WriteLine("\t},");
                        }
                        else
                        {
                            Console.WriteLine("\t}");
                        }
                    }

                    file.WriteLine("}");
                }
            }
            catch (Exception ex)
            {
                PrintExceptionMessage(ex);
            }
        }

这是我正在格式化的 JSON 文件的格式:

{
    "indicator": {
        "name": "Precio medio horario final contratación libre suma de componentes",
        "short_name": "Precio medio horario final c.libre suma",
        "id": 10214,
        "composited": true,
        "step_type": "linear",
        "disaggregated": false,
        "magnitud": [{
                "name": "Precio",
                "id": 23
            }
        ],
        "tiempo": [{
                "name": "Hora",
                "id": 4
            }
        ],
        "geos": [{
                "geo_id": 8741,
                "geo_name": "Península"
            }
        ],
        "values_updated_at": "2019-01-31T08:05:32.000+01:00",
        "values": [{
                "value": 49.38,
                "datetime": "2019-01-31T01:00:00.000+01:00",
                "datetime_utc": "2019-01-31T00:00:00Z",
                "tz_time": "2019-01-31T00:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 47.46,
                "datetime": "2019-01-31T02:00:00.000+01:00",
                "datetime_utc": "2019-01-31T01:00:00Z",
                "tz_time": "2019-01-31T01:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 46.82,
                "datetime": "2019-01-31T03:00:00.000+01:00",
                "datetime_utc": "2019-01-31T02:00:00Z",
                "tz_time": "2019-01-31T02:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 46.5,
                "datetime": "2019-01-31T04:00:00.000+01:00",
                "datetime_utc": "2019-01-31T03:00:00Z",
                "tz_time": "2019-01-31T03:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 47.36,
                "datetime": "2019-01-31T05:00:00.000+01:00",
                "datetime_utc": "2019-01-31T04:00:00Z",
                "tz_time": "2019-01-31T04:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 50.05,
                "datetime": "2019-01-31T06:00:00.000+01:00",
                "datetime_utc": "2019-01-31T05:00:00Z",
                "tz_time": "2019-01-31T05:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 56.61,
                "datetime": "2019-01-31T07:00:00.000+01:00",
                "datetime_utc": "2019-01-31T06:00:00Z",
                "tz_time": "2019-01-31T06:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 65.58,
                "datetime": "2019-01-31T08:00:00.000+01:00",
                "datetime_utc": "2019-01-31T07:00:00Z",
                "tz_time": "2019-01-31T07:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 66.59,
                "datetime": "2019-01-31T09:00:00.000+01:00",
                "datetime_utc": "2019-01-31T08:00:00Z",
                "tz_time": "2019-01-31T08:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 66.49,
                "datetime": "2019-01-31T10:00:00.000+01:00",
                "datetime_utc": "2019-01-31T09:00:00Z",
                "tz_time": "2019-01-31T09:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 65.54,
                "datetime": "2019-01-31T11:00:00.000+01:00",
                "datetime_utc": "2019-01-31T10:00:00Z",
                "tz_time": "2019-01-31T10:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 63.71,
                "datetime": "2019-01-31T12:00:00.000+01:00",
                "datetime_utc": "2019-01-31T11:00:00Z",
                "tz_time": "2019-01-31T11:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 61.94,
                "datetime": "2019-01-31T13:00:00.000+01:00",
                "datetime_utc": "2019-01-31T12:00:00Z",
                "tz_time": "2019-01-31T12:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 56.58,
                "datetime": "2019-01-31T14:00:00.000+01:00",
                "datetime_utc": "2019-01-31T13:00:00Z",
                "tz_time": "2019-01-31T13:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }, {
                "value": 56.08,
                "datetime": "2019-01-31T15:00:00.000+01:00",
                "datetime_utc": "2019-01-31T14:00:00Z",
                "tz_time": "2019-01-31T14:00:00.000Z",
                "geo_id": 8741,
                "geo_name": "Península"
            }
        ]
    }
}

我只从这里获取“价值”和“日期时间”数据。

我现在得到的文件有这种格式(真的很糟糕,对不起):

{

    {
        "datetime": 01/02/2019 01:00:00,        "value": 48,68
    },

    {
        "datetime": 01/02/2019 02:00:00,        "value": 45,7
    },

    {
        "datetime": 01/02/2019 03:00:00,        "value": 44,1
    },

    {
        "datetime": 01/02/2019 04:00:00,        "value": 44,53
    },

    {
        "datetime": 01/02/2019 05:00:00,        "value": 46,87
    },

    {
        "datetime": 01/02/2019 06:00:00,        "value": 49,84
    },

    {
        "datetime": 01/02/2019 07:00:00,        "value": 56,69
    },

    {
        "datetime": 01/02/2019 08:00:00,        "value": 62,5
    },
}

我想得到的是:

{
    {
        "datetime": 01/02/2019 01:00:00,
        "value": 48,68
    },{
        "datetime": 01/02/2019 02:00:00,
        "value": 45,7
    },{
        "datetime": 01/02/2019 03:00:00,
        "value": 44,1
    },{
        "datetime": 01/02/2019 04:00:00,
        "value": 44,53
    },{
        "datetime": 01/02/2019 05:00:00,
        "value": 46,87
    },{
        "datetime": 01/02/2019 06:00:00,
        "value": 49,84
    },{
        "datetime": 01/02/2019 07:00:00,
        "value": 56,69
    },{
        "datetime": 01/02/2019 08:00:00,
        "value": 62,5
    }
}

非常感谢,我很抱歉。我对 JSON 和在 C# 上格式化它真的很陌生。

标签: c#json

解决方案


您需要将您选择的键/值对从 json 解析为类对象列表,然后将其再次保存到新文件中,例如

private static void ParseData()
{
    string json = File.ReadAllText(@"Path to your input json file");

    JObject jsonData = JObject.Parse(json);

    List<MyCustomClass> output = new List<MyCustomClass>();

    foreach (JToken tokens in jsonData["indicator"]["values"])
    {
        output.Add(new MyCustomClass { datetime = tokens["datetime"].ToString(), value = tokens["value"].ToString() });
    }

    File.WriteAllText(@"Path to your output json file", JToken.FromObject(output).ToString());
}

你需要一个类对象来解析你的键/值对,

class MyCustomClass
{
    public string datetime { get; set; }
    public string value { get; set; }
}

输出:

[
  {
    "datetime": "31-01-2019 05:30:00 AM",
    "value": "49.38"
  },
  {
    "datetime": "31-01-2019 06:30:00 AM",
    "value": "47.46"
  },
  {
    "datetime": "31-01-2019 07:30:00 AM",
    "value": "46.82"
  },
  {
    "datetime": "31-01-2019 08:30:00 AM",
    "value": "46.5"
  },
  {
    "datetime": "31-01-2019 09:30:00 AM",
    "value": "47.36"
  },
  {
    "datetime": "31-01-2019 10:30:00 AM",
    "value": "50.05"
  },
  {
    "datetime": "31-01-2019 11:30:00 AM",
    "value": "56.61"
  },
  {
    "datetime": "31-01-2019 12:30:00 PM",
    "value": "65.58"
  },
  {
    "datetime": "31-01-2019 01:30:00 PM",
    "value": "66.59"
  },
  {
    "datetime": "31-01-2019 02:30:00 PM",
    "value": "66.49"
  },
  {
    "datetime": "31-01-2019 03:30:00 PM",
    "value": "65.54"
  },
  {
    "datetime": "31-01-2019 04:30:00 PM",
    "value": "63.71"
  },
  {
    "datetime": "31-01-2019 05:30:00 PM",
    "value": "61.94"
  },
  {
    "datetime": "31-01-2019 06:30:00 PM",
    "value": "56.58"
  },
  {
    "datetime": "31-01-2019 07:30:00 PM",
    "value": "56.08"
  }
]

推荐阅读