有没有办法用内部对象序列化Dictionary <string,string =“”>?

时间:2018-02-15 16:21:55

标签: c# json.net

我有下一本字典

 var invoiceParams = new Dictionary<string, string>();
 invoiceParams.Add("order_id", "111");
 invoiceParams.Add("goods", "[{amount:100, count: 2}]");

 var jsonString = JsonConvert.SerializeObject(invoiceParams);

我可以使用newtonsoft.json将其序列化为下一个JSON吗?

{
   "order_id":111,
   "goods":[
      {
         "amount":100,
         "count":2
      }
   ]
}

2 个答案:

答案 0 :(得分:1)

为什么不把它作为一个对象?

 var invoiceParams = new Dictionary<string, string>();
 invoiceParams.Add("order_id", "111");
 invoiceParams.Add("goods", new List<object>(){ new {amount=100, count=2}});
 var jsonString = JsonConvert.SerializeObject(invoiceParams);

答案 1 :(得分:1)

当我想以JSON格式输出数据时,我通常使用命名类型。我指的是代表数据结构的普通旧C#类。它们是一个不错的选择,因为它们可用于反序列化数据以及序列化数据。实际上,我的数据模型通常都位于类库项目中,因此任何生产者或消费者都可以根据需要重用它们。另一个优点是您可以将Attributes放在Properties上,这对于自定义JSON.Net非常有用。

如果我感到更缺乏努力(阅读:懒惰)并且不需要反序列化的好处,那么有时候我会使用Anonymous Types。您可以随时创建一个新类型&#34;可以这么说,你要输出哪种格式。

以下是在输出过程中使用Anonymous Types重新格式化数据的示例。

这是DotNet Fiddle的代码:https://dotnetfiddle.net/wLkoLk

这是代码本身:

using System;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        var data = new
        {
            order_id = "111",
            isTrue = true,
            rating = 3,
            goods = 
            new []
            {
                new
                {
                    amount = 100,
                    count = 2
                },
                new
                {
                    amount = 9001,
                    count = 1
                }
            }
        };

        var json = JsonConvert.SerializeObject(data, new JsonSerializerSettings() { Formatting = Formatting.Indented });

        Console.WriteLine(json);
    }
}

这里是JSON输出:

{
  "order_id": "111",
  "isTrue": true,
  "rating": 3,
  "goods": [
    {
      "amount": 100,
      "count": 2
    },
    {
      "amount": 9001,
      "count": 1
    }
  ]
}

那么命名类型方法是什么样的?

这是工作的DotNet小提琴:https://dotnetfiddle.net/d7sJua

以下是代码:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

public class Invoice
{
    [JsonProperty("order_id")]  
    public string OrderId { get;set;}

    public List<Good> Goods { get;set;}
}

public class Good
{
    public int Amount { get;set;}
    public int Count { get;set;}
}

public class Program
{   
    public static void Main()
    {
        var invoice = new Invoice()
        {
            OrderId = "111",
            Goods = new List<Good>()
            {
                new Good()
                {
                    Amount = 100,
                    Count = 2
                }
            }
        };

        var json = JsonConvert.SerializeObject(invoice, new JsonSerializerSettings()
        {
            Formatting = Formatting.Indented,
            ContractResolver = new CamelCasePropertyNamesContractResolver() 
        });

        Console.WriteLine(json);
    }
}

JSON输出:

{
  "order_id": "111",
  "goods": [
    {
      "amount": 100,
      "count": 2
    }
  ]
}