简体   繁体   中英

Saving data in json format using c#

I want to save data in local json file in this format:

[
{"Name":"sdafdsf","Password":"dsfads","FirstName":"fsdf","LastName":"dsfdafas"},
{"Name":"sddafdsf","Password":"dsfadds","FirstName":"fdsdf","LastName":"dsfdafasdfs"} 
]

I am using this in the controller to serialize into json format:

 public ActionResult Index(demo obj)
        {

            String json = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
            string path = Server.MapPath("~/app/");
            //// Write that JSON to txt file,  
            //var read = System.IO.File.ReadAllText(path + "output.json");
            System.IO.File.WriteAllText(path + "output.json",  json);
            return View();
        }

This is my model:

public class demo
    {

        public string Name { get; set; }
        public string Password { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

But instead of proper JSON format I am getting this in my output.json file:

{"Name":"sdafdsf","Password":"dsfads","FirstName":"fsdf","LastName":"dsfdafas"}{"Name":"adfsdsfsafdsafasdfsdfsadf","Password":"dfsaasdsa","FirstName":"safd","LastName":"dfsafads"}

How can I save data in the proper format?

This is the proper format, if you mean you need it like an array then add the object to an array and after that serialize it:

 public ActionResult Index(demo obj)
        {
    var array = new [] {obj};
            String json = Newtonsoft.Json.JsonConvert.SerializeObject(array);
            string path = Server.MapPath("~/app/");
            //// Write that JSON to txt file,  
            //var read = System.IO.File.ReadAllText(path + "output.json");
            System.IO.File.WriteAllText(path + "output.json",  json);
            return View();
        }  

Or:

var list = new List<demo>();
list.Add(obj);
String json = Newtonsoft.Json.JsonConvert.SerializeObject(list);

if you want to keep data always in an array then you always need to:

  1. read data from the json file.
  2. desalinize as a list of `List'.
  3. add the new item to this list.
  4. serialize it again and save it over that file replacing all the old text with the new one.

like this:

 public ActionResult Index(demo obj)
        {
          string path = Server.MapPath("~/app/");
        var read = System.IO.File.ReadAllText(path + "output.json");
        List<demo> lst = Newtonsoft.Json.JsonConvert.DeserializeObject<List<demo>>(read);
        if (lst == null)
        {
            List<demo> _data = new List<demo>();
            _data.Add(obj);
           String json = Newtonsoft.Json.JsonConvert.SerializeObject(_data.ToArray());
            System.IO.File.WriteAllText(path + "output.json", json);
        }
        else
        {
            lst.Add(obj);
            String json = Newtonsoft.Json.JsonConvert.SerializeObject(lst);
            System.IO.File.WriteAllText(path + "output.json", json);
        }
        return View();
        }  

Of course you can write cleaner code by separate some pieces.

Create a List of objects first and then try to Serialize the list. I'm sure you will get the desired output. Seems like you used AppendAllText method by Serializing single object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM