json将新对象添加到现有的json文件C#

时间:2015-10-12 12:25:22

标签: c# json

我试图自动将新对象添加到现有的json文件中。我环顾网络,但只发现添加数据和东西,但不是整个对象。这就是我想编辑的文件的外观:

[
    {"id":"123","name":"carl"}
]

我想去

[
     {"id":"123","name":"carl"},
     {"id":"1234","name":"carl2"}
]

感谢您的所有答案,但我不认为每个人都完全明白我的意思我尝试了一些答案,但后来我明白了:

[
    "{\"id\":\"123\",\"name\":\"carl\"}"
]"{\"id\":\"1234\",\"name\":\"carl2\"}"

我希望在[]。

之间进行翻转

5 个答案:

答案 0 :(得分:12)

如果你使用json.NET,你可以简单地反序列化和序列化json。

var list = JsonConvert.DeserializeObject<List<Person>>(myJsonString);
list.Add(new Person(1234,"carl2");
var convertedJson = JsonConvert.SerializeObject(list, Formatting.Indented);

答案 1 :(得分:6)

使用Json.Net

//load from file
var initialJson = "[{\"id\":\"123\",\"name\":\"carl\"}]";

var array = JArray.Parse(initialJson);

var itemToAdd = new JObject();
itemToAdd["id"] = 1234;
itemToAdd["name"] = "carl2";
array.Add(itemToAdd);

var jsonToOutput = JsonConvert.SerializeObject(array, Formatting.Indented);

//save to file here

使用此方法并不需要强类型对象

您可以替换此位:

//load from file
var initialJson = "[{\"id\":\"123\",\"name\":\"carl\"}]";

使用

var initialJson = File.ReadAllText(@"c:\myjson.json")

从文本文件加载json

答案 2 :(得分:1)

你可以创建一个方法:

public string AddObjectsToJson<T>(string json, List<T> objects)
{
    List<T> list = JsonConvert.DeserializeObject<List<T>>(json);
    list.Add(objects);
    return JsonConvert.SerializeObject(list);
}

然后像这样使用它:

string baseJson = "[{\"id\":\"123\",\"name\":\"carl\"}]";
List<Person> personsToAdd = new List<Person>() { new Person(1234,"carl2") };

string updatedJson = AddObjectsToJson(baseJson, personsToAdd);

答案 3 :(得分:0)

比序列化/反序列化大文件更好的解决方案是打开FileStream,在末尾查找1个字符,然后序列化并将新对象写入数组,然后写一个右括号。看到这个问题C# How to delete last 2 characters from text file and write into the same line at the end my text?,我将在这里复制代码-您已经知道如何序列化对象并将其编码为字节。

using(var fs = new FileStream("file.json")) {    
    fs.Seek(-1,SeekOrigin.End);        
    fs.Write(mySerializedJSONObjAsBytes,0,mySerializedJSONObjAsBytes.Length); // include a leading comma character if required
    fs.Write(squareBracketByte, 0, 1);
    fs.SetLength(fs.Position); //Only needed if new content may be smaller than old
}

对不起,您还没有测试过任何东西,这超出了我的头脑。提示:将FileStream包裹在StreamWriter中,以便可以直接编写字符串。

答案 4 :(得分:0)

这将是您的示例:

var list = JsonConvert.DeserializeObject<List<Example>>(json);
    Example example = new Example();
    example.name = "Product2";
    example.id="1";
    list.Add(example);
    
    string output = JsonConvert.SerializeObject(list);
    
    public class Example
    {
        public string id {get;set;}
        public string name { get; set; }
        
    }