我有下一本字典
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
}
]
}
答案 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
}
]
}