我有这个非常简单的方法如下:
//my current file
using Newtonsoft.Json;
string key1 = "FirstKey";
string key2 = "SecondKey";
string key3 = "ThirdKey";
private string CreateJson(string val1, string val2, string val3,string val4, string val5, string val6)
{
//process the six arguments and three key-related member variables to create a JSON array
//don't want to use JsonConvert.SerializeObject the way I'm doing below as it requires creating a class
var configs = new List<CustomClass>
{ new CustomClass{ FirstKey = val1,SecondKey= val2,ThirdKey= val3}
, new CustomClass{ FirstKey= val4,SecondKey= val5,ThirdKey = val6}
};
var jsonData = JsonConvert.SerializeObject(configs);
return jsonData;
}
//A class in another file
public class CustomClass
{
public string FirstKey { get; set; }
public string SecondKey{ get; set; }
public string ThirdKey{ get; set; }
}
我正在尝试使用JSON.Net创建JSON数组。预期产出如下:
[{"FirstKey":val1,"SecondKey":val2,"ThirdKey":val3}
, {"FirstKey":val4,"SecondKey":val5,"ThirdKey":val6}]
此处val1
到val6
值应该在运行时被参数值替换。
最初,由于只有三种类型的字符串键值对,所以我认为只需使用字符串文字并以JSON格式依次追加即可创建JSON字符串非常简单。但很快我偶然发现了可以使JSON字符串变形的转义字符世界,例如: \r
。
过去我一直在使用JSON.Net库来简单地使用JSONConvert
类来序列化和反序列化对象,我从不关心并且完全没有意识到JSON.Net库的这种处理转义字符的做法让我们保持JSON字符串有效。
无论如何,回到我的问题。我能够通过创建具有三个属性FirstKey
,SecondKey
和ThirdKey
的自定义类来解决我的问题。然后,创建该类的对象,然后将参数val1
和val2
中的值分配给然后使用JsonConvert.SerializeObject
API。
我想要一种使用JSON.Net NuGet包创建JSON字符串的简单方法,而不涉及自定义类。完全创建一个类CustomClass
感觉就像是一个开销。我正在寻找类似于StringBuilder.Append
API的东西,如果它在我正在使用的JSON库中可用的话。我不确定我是否遗漏了JSON.Net中的任何API。
答案 0 :(得分:8)
正如评论中所提到的,您可以使用匿名对象轻松创建它。
private string CreateJson(string val1, string val2, string val3, string val4, string val5, string val6) {
var configs = new[]
{
new { FirstKey = val1, SecondKey = val2, ThirdKey = val3},
new { FirstKey = val4, SecondKey = val5, ThirdKey = val6}
};
var jsonData = JsonConvert.SerializeObject(configs);
return jsonData;
}
答案 1 :(得分:1)
通过@code4life在已接受答案中的评论获得一些线索,我意识到它可以通过JArray
命名空间中的Newtonsoft.Json.Linq
对象实现。所以,我想建立另一个答案,提供一个替代方案,以防它帮助某人:
using Newtonsoft.Json.Linq;
private string CreateJson(string val1, string val2, string val3, string val4, string val5, string val6)
{
var configs = new[]
{
new { FirstKey = val1, SecondKey = val2, ThirdKey = val3},
new { FirstKey = val4, SecondKey = val5, ThirdKey = val6}
};
return JArray.FromObject(configs).ToString();
}
注意:通过new { FirstKey = val1, SecondKey = val2, ThirdKey = val3}
语法创建的匿名类型很可能包含任何.Net数据类型,而不仅仅是我在原始帖子中提到的字符串例如,new { FirstKey = "AnyString", SecondKey = true, ThirdKey = DateTime.Now}
答案 2 :(得分:-1)
有JsonWriter
,仅比StringBuilder
多-您没有太多限制,并且可能最终得到不正确的文档
前段时间,我想创建简单的文档而没有序列化的开销,但是要保证它们是正确的。
我使用的模式是:
var doc = JSONElement.JSONDocument.newDoc(true);
using (var root = doc.addObject())
{
root.addString("firstName", "John");
root.addString("lastName", "Smith");
root.addBoolean("isAlive", true);
root.addNumber("age", 27);
using (var addres = root.addObject("address"))
{
addres.addString("streetAddress", "21 2nd Street");
addres.addString("city", "New York");
addres.addString("state", "NY");
addres.addString("postalCode", "10021-3100");
}
using (var phoneNumbers = root.addArray("phoneNumbers"))
{
using (var phone = phoneNumbers.addObject())
{
phone.addString("type", "home");
phone.addString("number", "212 555-1234");
}
//[....]
}
}
string output = doc.getOutput();
}
可在以下位置使用模块(<300行):https://github.com/AXImproveLtd/jsonDocCreate