Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从字符串创建JSON而不使用JSON.Net库创建自定义类_C#_.net_Json_Json.net - Fatal编程技术网

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。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效-