C# 如何从字符串创建JSON而不使用JSON.Net库创建自定义类
我有一个非常简单的方法,如下所示:C# 如何从字符串创建JSON而不使用JSON.Net库创建自定义类,c#,.net,json,json.net,C#,.net,Json,Json.net,我有一个非常简单的方法,如下所示: //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) { /
//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; }
}
[{"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
中的值分配给Then,然后使用JsonConvert.SerializeObject
API
我想要一种非常简单的方法,使用JSON.NETNuget包创建JSON字符串,而不涉及自定义类。在这里创建一个类
CustomClass
感觉就像是一项开销。我正在寻找类似于StringBuilder.Append
API的东西,如果它在我使用的JSON库中可用的话。我不确定我是否丢失了JSON.Net中的任何API。如评论中所述,您可以使用匿名对象轻松创建它
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;
}
从接受答案中的注释中得到一些线索,我意识到可以通过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();
}
注意:通过
新建{FirstKey=val1,SecondKey=val2,ThirdKey=val3}
语法创建的匿名类型可以很好地包含任何.Net数据类型,而不仅仅是我在原始帖子中要求的字符串,例如新建{FirstKey=“AnyString”,SecondKey=true,ThirdKey=DateTime.Now}
有一个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行)在此处可用:已经有答案,例如,将值选择为匿名类型,然后将其序列化。@stuartd因为我需要一个JSON数组作为最终输出,所以我必须创建一个
列表。如何定义List
变量?您甚至可以使用JObject.FromObject
来复制变量@code4life虽然Nkosi的解决方案非常简单,我一直在寻找,但我仍然尝试使用JObject.FromObject
来完成它,但我得到了System.ArgumentException
异常,表示对象序列化到数组。应为JObject实例。
。如果可能的话,你能帮我用一些最简单的代码片段来实现同样的效果吗?我在@code4life找到了它。实际上它是JArray.FromObject
API。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效-