免责声明:C#并不是我的强项,伙计们;我通常是个数据库专家.其中很多都是我在这里和那里找到的代码拼凑而成的;所以请对我宽容一些.

我正在try 弄清楚如何向用户打开的现有JSON文档添加新对象,然后保存对该文件的更新.下面是一个编成的JSON,遵循相同的基本 struct ,我希望能够添加一个新的"汽车"到"人"."新"值通过文本框和下拉列表出现.

{
  "Name": "Bob Bob",
  "City": "Louisville",
  "State": "Kentucky",
  "Address": "123 City Ln",
  "Cars": [
    {
      "Make": "Ford",
      "Model": "Explorer",
      "Color": "White"
    },
    {
      "Make": "Dodge",
      "Model": "Caravan",
      "Color": "White"
    },
    {
      "Make": "Bat",
      "Model": "Mobile",
      "Color": "Black:"
    }
  ],
  "Jobs": [
    {
      "Employer": "Walmart",
      "Position": "Greeter",
      "Pay": "$35,000",
      "EndDate": "12/25/1999"
    },
    {
      "Employer": "Target",
      "Position": "Cashier",
      "Pay": "$32,000",
      "EndDate": "1/1/2002"
    },
    {
      "Employer": "SkyNet",
      "Position": "Programmer",
      "Pay": "$86,000",
      "EndDate": "5/8/2023"
    }
  ]
}

我已经设置了以下班级

public class Person
{
    public string Name { get; set;}
    public string City { get; set;}
    public string State { get; set;}
    public string Address { get; set;}
    public Cars[] Cars {get; set;}
    public Jobs[] Jobs {get; set;}
}

public class Cars
{
    public string Make { get; set;}
    public string Model { get; set;}
    public string Color { get; set;}
}

public class Jobs
{
    public string Employer { get; set;}
    public string Position { get; set;}
    public string Pay { get; set;}
    public string EndDate { get; set;}
}

以下是我到目前为止拥有的代码

private void btnSaveUpdates_Click(object sender, EventArgs e)
{
    string Make = cbMake.Text;
    string Model = txtModel.Text;
    string Color = cbColor.Text;
    string filePath = txtFileLoc.Text;

    DoJSONWork(filePath, Make, Model, Color);
}

public static void DoJSONWork(string filePath, string Make, string Model, string Color)
{
    var FileStream = File.OpenRead(filePath);

    using (StreamReader reader = new StreamReader(FileStream))
    {
        using (JsonTextReader JSONreader = new JsonTextReader(reader))
            {
                JSONreader.SupportMultipleContent = true;

                var serializer = new JsonSerializer();
                while (JSONreader.Read())
                {
                    if (JSONreader.TokenType == JsonToken.StartObject)
                    {
                        Person p = serializer.Deserialize<Person>(JSONreader);

                        Cars cars = p.Cars.FirstOrDefault(c => c.Make + c.Model + c.Color == Make + Model + Color);
                        if (cars == null)
                        {
                            cars = new Cars
                            {
                                Make = Make,
                                Model = Model,
                                Color = Color
                            };
                            p.Cars = p.Cars.Concat(new Cars[]
                            {
                              cars
                            }).ToArray();

                        }

                    }
                }
            }
        }

        //I honestly don't know what to do next 
    }

我正在努力想办法更新JSON文档中的"汽车".我需要反序列化和序列化整个JSON文档吗?

推荐答案

您不需要任何类,只需解析您的json

    var json =File.ReadAllText(filePath);

    var jObj = JObject.Parse(json);
    var cars = (JArray)jObj["Cars"];
    
    if (cars == null) cars = new JArray();
    else if (cars.Any(c => ((string)c["Make"]) == Make
                                && ((string)c["Model"]) == Model
                                 && ((string)c["Color"]) == Color)) 
                                return;
    cars.Add(new JObject
    {

        ["Make"] = Make,
        ["Model"] = Model,
        ["Color"] = Color
    });
    
    json=jObj.ToString();
    
    File.WriteAllText(filePath, json);

或者你可以使用汽车类,因为你已经有了

    var jObj = JObject.Parse(json);

    List<Cars> cars = jObj["Cars"].ToObject<List<Cars>>();

    if (cars.Any(c => c.Make + c.Model + c.Color == Make + Model + Color)) return;

    cars.Add(new Cars
    {
        Make = Make,
        Model = Model,
        Color = Color
    });

    jObj["Cars"] = JArray.FromObject(cars);

    json = jObj.ToString();

Csharp相关问答推荐

PostingAsJsonAschange在从调用的方法返回时给出500错误

无法使用ternal- .net修复可空警告

为什么我不能更改尚未设置的模拟对象属性的值?

CsWin32如何创建PWSTR的实例,例如GetWindowText

使用特定格式的JsonConvert序列化对象

如何告诉自己创建的NuGet包在应用程序中发生了变化?

为什么C#Bigbit不总是相同的比特长度?

.NET HttpClient、JsonSerializer或误用的Stream中的内存泄漏?

如何注册类使用多级继承与接口

未找到任何HTTP触发器.成功部署Azure Functions Project后(c#)

单元测试:模拟返回空

使用Entity Framework6在对象中填充列表会导致列表大多为空

如何使用.NET6WPF打印车票?

当我没有此令牌时,为什么语法报告EOF错误?

正在try 从Blazor中的API读取JSON

带有可选参数的模拟方法返回意外的不同值,具体取决于可选的默认值

如何将%{v_扩展}转换为%{v_扩展}>>

无法向Unity注册Microsoft Logger

Xamarin Forms应用程序中登录页面的用户名和密码编辑文本之间不需要的空格

为什么C#中的类型别名不能在另一个别名中使用?