如何使用JSON.Net库

时间:2017-07-04 01:01:08

标签: 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)
{
    //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}]

此处val1val6值应该在运行时被参数值替换。

最初,由于只有三种类型的字符串键值对,所以我认为只需使用字符串文字并以JSON格式依次追加即可创建JSON字符串非常简单。但很快我偶然发现了可以使JSON字符串变形的转义字符世界,例如: \r

过去我一直在使用JSON.Net库来简单地使用JSONConvert类来序列化和反序列化对象,我从不关心并且完全没有意识到JSON.Net库的这种处理转义字符的做法让我们保持JSON字符串有效。

无论如何,回到我的问题。我能够通过创建具有三个属性FirstKeySecondKeyThirdKey的自定义类来解决我的问题。然后,创建该类的对象,然后将参数val1val2中的值分配给然后使用JsonConvert.SerializeObject API。

我想要一种使用JSON.Net NuGet包创建JSON字符串的简单方法,而不涉及自定义类。完全创建一个类CustomClass感觉就像是一个开销。我正在寻找类似于StringBuilder.Append API的东西,如果它在我正在使用的JSON库中可用的话。我不确定我是否遗漏了JSON.Net中的任何API。

3 个答案:

答案 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