C#将JSON序列化和反序列化为文本文件

10

我在我的wpf应用程序中使用NewtonSoft来处理json。我有一个可以保存到txt文件中的客户端(不涉及数据库)。我是这样做的:

public int store(string[] reservation)
{
    JObject customer = new JObject(
        new JProperty("id", this.getNewId()),
        new JProperty("name", reservation[0]),
        new JProperty("address", reservation[1]),
        new JProperty("gender", reservation[2]),
        new JProperty("age", reservation[3])
    );

    using (StreamWriter file = File.CreateText(Settings.databasePath +  "customer.json"))
    using (JsonTextWriter writer = new JsonTextWriter(file))
    {
        customer.WriteTo(writer);
    }

    return 1;
}

结果看起来像这样:

{"id":1,"name":"Lars","address":"Bosch 10","gender":"Man","age":"19"}

然后我尝试像这样获取所有客户:

if(File.Exists(Settings.databasePath + "customer.json"))
{
    List<Customer> customers;

    using (StreamReader r = new StreamReader(Settings.databasePath + "customer.json"))
    {
        string json = r.ReadToEnd();
        customers = JsonConvert.DeserializeObject<List<Customer>>(json);
    }
}

但是我收到了这个错误(无法复制错误):

输入图像描述 已经尝试将其存储为jArray,但没有起作用。我该如何让它工作?

任何帮助都将不胜感激。:)


2
你只写了一个客户到文件中,但尝试读取一个客户数组是不行的...这样做不会起作用。为什么写入客户的JArray没有起作用?这就是你需要做的。 - René Vogt
1
你打算在同一个文件中保存多个客户的信息吗?还是为每个客户在同一位置保存多个文件? - Tha'er AlAjlouni ثائر العجلوني
2
离题:性别应该是男/女。 - Renatas M.
是的,我正在尝试将多个客户保存到同一个文件中。稍后我会发布一篇编辑文章,解释为什么 JArray 没有起作用。请稍等片刻。 - Jenssen
您的客户端是否真正具有名称属性? - bcesars
是的,我已经检查过了。 - Jenssen
2个回答

10
我会这样做:

我会按照以下方式进行:

public class Customer
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string Gender { get; set; }
    public int Age { get; set; }
}

public void AddCustomer(Customer newCustomer)
{
    var json = File.ReadAllText(pathToTheFile);
    var customers = JsonConvert.DeserializeObject<List<Customer>>(json);
    customers.Add(newCustomer);
    File.WriteAllText(pathToTheFile, JsonConvert.SerializeObject(customers));
}

public Customer GetCustomer(string id)
{
    var json = File.ReadAllText(pathToTheFile);
    var customers = JsonConvert.DeserializeObject<List<Customer>>(json);
    var result = new Customer();
    foreach (var c in customers)
    {
        if (c.Id == id)
        {
            result = c;
            break;
        }
    }
    return result;
}

1
这种方法意味着在内存中不必要地保存临时字符串表示,我更喜欢使用流来处理。 - N. Kudryavtsev

5
你的问题在于你试图从文件中获取客户列表,而实际上你只保存了一个客户。
如果你想在文件中存储多个客户,你需要创建一个 JArray 并将你的客户添加到其中:
//The customers array
private JArray customers = new JArray();

//Store new customer in array
public int Store(string[] reservation)
{
    JObject customer = new JObject(
        new JProperty("id", this.getNewId()),
        new JProperty("name", reservation[0]),
        new JProperty("address", reservation[1]),
        new JProperty("gender", reservation[2]),
        new JProperty("age", reservation[3])
    );

    //Add customer to customers array
    customers.add(customer);

    return 1;
}

然后,只需保存客户的JArray:

//Save array
public void Save()
{

    StreamWriter file = File.CreateText(Settings.databasePath +  "customer.json");

    using (JsonTextWriter writer = new JsonTextWriter(file))
    {
        //Save JArray of customers
        customers.WriteTo(writer);
    }
}

您可能需要根据自己的需求调整此代码。

我尽力写正确的英语,但请随意纠正我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接