C# 提取不规律的json 数组


{
 "Code": 0,
 "Message": "操作成功",
 "Data": "[\"20230517181314049\",[\"8888\",1.0]\",[\"8888\",1.0]\",[\"8888\",1.0]]"
} 

"Data": "[\"20230517181314049\",[\"8888\",1.0]\",[\"8888\",1.0]\",[\"8888\",1.0]]"

// 也可能是这样的
"Data": "[\"20230517181314049\"]"

// 也可能是这样的
"Data": "[\"20230517181314049\",[\"8888\",1.0]\"]"

我转成了一个json

Data 是string 数据类型

"["20230517181314049",["8888",1.0]",["8888",1.0]",["8888",1.0]]"

分别提取成

字符串 20230517181314049
List集合 ["8888",1.0]",["8888",1.0]",["8888",1.0]

有没有什么好办法 提取

引用chatgpt部分指引作答:
你可以使用Json.NET库来处理这个不规则的JSON数组。以下是一个使用C#提取数据的示例代码:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        string jsonString = "{\"Code\": 0, \"Message\": \"操作成功\", \"Data\": \"[\\\"20230517181314049\\\",[\\\"8888\\\",1.0],[\\\"8888\\\",1.0],[\\\"8888\\\",1.0]]\"}";

        JObject jsonObject = JsonConvert.DeserializeObject<JObject>(jsonString);
        string dataString = jsonObject["Data"].ToString();

        JArray dataArray = JArray.Parse(dataString);
        string firstValue = dataArray[0].ToString();
        List<object> listValues = dataArray.ToObject<List<object>>();

        Console.WriteLine("First Value: " + firstValue);
        Console.WriteLine("List Values:");
        foreach (var item in listValues)
        {
            Console.WriteLine(item.ToString());
        }
    }
}

这段代码使用Json.NET库来解析JSON字符串。首先,我们将JSON字符串反序列化为JObject对象,然后提取Data字段的值。接下来,我们使用JArray.Parse方法将Data字段的值解析为JArray对象。你可以使用JArray对象来访问和处理数组元素。在示例中,我们提取了第一个值和整个数组作为一个List对象。你可以根据需要进一步处理和使用这些提取的数据。
在使用此代码之前,请确保已安装并引用了Json.NET库。你可以通过NuGet包管理器或手动下载和添加引用来获取Json.NET库。

参考GPT和自己的思路:可以使用Json.NET库对JSON字符串进行解析。

首先需要将Data字段的值转成JArray对象,然后按照索引提取需要的数据:

using Newtonsoft.Json.Linq;

// 假设json字符串存储在变量json中
JObject obj = JObject.Parse(json);
JArray data = JArray.Parse(obj["Data"].ToString());

string str = data[0].ToString();
List<string> list = data.Skip(1).Select(x => x.ToString()).ToList();

其中,str就是需要提取的字符串值,list就是需要提取的列表。

参考GPT和自己的思路:可以尝试用 Json.NET 库来解析这个不规则的 JSON 数组。具体代码可以如下:

using Newtonsoft.Json.Linq;
using System.Collections.Generic;

...

// 原始的 JSON 数据字符串
string jsonData = "[\"20230517181314049\",[\"8888\",1.0]\",[\"8888\",1.0]\",[\"8888\",1.0]]";

// 将 JSON 串解析为 JArray 对象
JArray jArray = JArray.Parse(jsonData);

// 从 JArray 对象中提取出字符串和 List 集合
string strData = jArray[0].ToString();

List<string> listData = new List<string>();
for (int i = 1; i < jArray.Count; i++)
{
    string item = jArray[i].ToString();
    if (item.StartsWith("[") && item.EndsWith("]"))
    {
        item = item.TrimStart('[').TrimEnd(']');
        listData.AddRange(item.Split(','));
    }
    else
    {
        listData.Add(item);
    }
}

解释一下代码的思路:

  • 首先利用 Json.NET 库的 JArray 类型,将原始的 JSON 数据字符串解析为 JArray 对象。
  • 然后从 JArray 对象中,提取出第一个元素作为字符串数据 strData。
  • 遍历 JArray 对象,如果遇到了类似 ["8888",1.0] 的 List 集合数据,就将其逐个添加到 List 中。如果是类似 "20230517181314049" 的字符串数据,则直接添加到 List 中。

引入ChatGPT部分内容参考:
您可以使用 Newtonsoft.Json 库来解析这个 JSON 字符串。首先,您需要将 "Data" 字段的值转换为 JArray 对象,然后提取其中的数据。

以下是示例代码

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;

namespace JsonParsingExample
{
    class Program
    {
        static void Main(string[] args)
        {
            string json = @"
            {
                ""Code"": 0,
                ""Message"": ""操作成功"",
                ""Data"": ""[\""20230517181314049\"",[\""8888\"",1.0], [\""8888\"",1.0], [\""8888\"",1.0]]""
            }";

            JObject obj = JObject.Parse(json);
            JArray dataArray = JArray.Parse(obj["Data"].ToString());

            string strData = dataArray[0].ToString();
            List<string> listData = new List<string>();
            for (int i = 1; i < dataArray.Count; i++)
            {
                listData.Add(dataArray[i].ToString());
            }

            Console.WriteLine("字符串数据:{0}", strData);
            Console.WriteLine("List 数据:");
            foreach (string data in listData)
            {
                Console.WriteLine(data);
            }
        }
    }
}

输出结果:

字符串数据:20230517181314049
List 数据:
["8888",1.0]
["8888",1.0]
["8888",1.0]

上面代码基本都是可以的,如果不满足,可以联系我

定义一个实体对象,属性为
TestModel:Code Message Data 对象
再定义一个 Data对象 作为上面的引用
属性包含 name ,arr 数组

然后获取数据进行序列化就行了