代码之家  ›  专栏  ›  技术社区  ›  RBT

如何从字符串创建JSON,而不使用JSON创建自定义类。Net库

  •  6
  • RBT  · 技术社区  · 9 年前

    我有一个方法,我试图创建JSON字符串:

    //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 值应该在运行时被参数值替换。

    \r .

    JSONConvert 类和我从来都不关心,也完全不知道JSON对转义字符的处理。Net库在后台为我们保留JSON字符串的有效性。

    FirstKey , SecondKey ThirdKey 。然后,创建类的对象,然后在参数中赋值 val2 然后再使用 JsonConvert.SerializeObject 应用程序编程接口。

    CustomClass StringBuilder.Append API,如果它在我使用的JSON库中可用。我不确定JSON.Net中是否缺少任何API。

    4 回复  |  直到 4 年前
        1
  •  14
  •   Nkosi    9 年前

    正如在评论中提到的,您可以同样轻松地使用匿名对象创建它。

    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;
    }
    
        2
  •  1
  •   RBT    4 年前

    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} [1]: https://stackoverflow.com/users/215741/code4life

        3
  •  1
  •   miniGweek    4 年前

    这里有另一种方法。 我不知道是什么 key 姓名将为。每个CSV文件都可以有不同的标题。

    https://weblog.west-wind.com/posts/2012/aug/30/using-jsonnet-for-dynamic-json-parsing

    下面是一个使用JObject和JArray的简单实现

    dotnet new console -n "Json.TypeLess"
    dotnet add package Newtonsoft.Json --version 13.0.1
    

    程序cs应具备:

    using Newtonsoft.Json.Linq;
    
    namespace Json.TypeLess
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                var records = new JArray();
                records.Add(CreateRecord("Johhny", "Singing"));
                records.Add(CreateRecord("Arjun", "Eating"));
                records.Add(CreateRecord("Sahil", "Reading"));
                records.Add(CreateRecord("Karthik", "Wuxia"));
    
                Console.WriteLine(records.ToString());
            }
    
            static JObject CreateRecord(string name, string likes)
            {
                var r = new JObject();
                r.Add("Name", name);
                r.Add("Likes", likes);
                return r;
            }
        }
    
    }
    

    [
      {
        "Name": "Johhny",
        "Likes": "Singing"
      },
      {
        "Name": "Arjun",
        "Likes": "Eating"
      },
      {
        "Name": "Sahil",
        "Likes": "Reading"
      },
      {
        "Name": "Karthik",
        "Likes": "Wuxia"
      }
    ]
    

    不使用NewtonSoft Json

    System.Text.Json.Nodes net本机类中的命名空间(我使用.NET6.0进行了测试)

    JObject JsonObject 而不是 JArray 使用 JsonArray 要获得json输出,请使用 ToJsonString() 对象上的方法

        4
  •  -1
  •   d219    6 年前

    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