如何NameValueCollection
简单地将 JSON 字符串转换为 C#,最好不使用 3rd 方解析器?
问问题
19433 次
3 回答
10
我不确定为什么每个人仍然推荐使用 JSON.NET 来反序列化 JSON。我写了一篇关于如何将 JSON 反序列化为 C#的博客文章。
简而言之,它是这样的:
using System.Web.Script.Serialization;
var jss = new JavaScriptSerializer();
var dict = jss.Deserialize<Dictionary<string, string>>(jsonText);
NameValueCollection nvc = null;
if (dict != null) {
nvc = new NameValueCollection(dict.Count);
foreach (var k in dict) {
nvc.Add(k.Key, k.Value);
}
}
}
var json = jss.Serialize(dict);
Console.WriteLine(json);
请务必添加对 System.Web.Extensions.dll 的引用。
注意:
我通常反序列化为dynamic
,所以我假设这NameValueCollection
会起作用。但是,我还没有验证它是否确实如此。
于 2012-07-09T16:18:02.497 回答
4
编辑
没有第三方开发的纯 .net 解决方案请看:JavaScriptSerializer – 字典到 JSON 序列化和反序列化
使用Json.NET
string jsonstring = @"{""keyabc"":""valueabc"",""keyxyz"":""valuexyz""}";
Dictionary<string, string> values =
JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonstring);
检查@jon 答案建议相同:.Net Linq to JSON with Newtonsoft JSON library
于 2012-07-09T16:08:50.240 回答
0
如果您的 JSON 包含其中的嵌套对象,则下面的解决方案将正确处理它们(基于 JSON.NET,但您可以适应您选择的 JSON 解析器)。
此用法示例:
var json = "{\"status\":\"paid\",\"date\":\"2019-10-09T17:30:51.479Z\",\"customer\":{\"id\":123456789,\"country\":\"br\",\"name\":\"Thomas Vilhena\",\"phone_numbers\":[\"+5511987654321\"],\"documents\":[{\"id\":\"doc_id\"}]}}";
var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
var nvc = new NameValueCollection(dict.Count);
AddKeyValuePairs(nvc, dict);
Console.WriteLine(nvc["status"]);
Console.WriteLine(nvc["date"]);
Console.WriteLine(nvc["customer[phone_numbers][0]"]);
Console.WriteLine(nvc["customer[id]"]);
Console.WriteLine(nvc["customer[documents][0][id]"]);
产生以下输出:
paid
09.10.2019 17:30
+5511987654321
123456789
doc_id
这是实现:
private static void AddKeyValuePairs(
NameValueCollection nvc,
Dictionary<string, object> dict,
string prefix = null)
{
foreach (var k in dict)
{
var key = prefix == null ? k.Key : prefix + "[" + k.Key + "]";
if (k.Value != null)
AddKeyValuePair(nvc, key, k.Value);
}
}
private static void AddKeyValuePair(
NameValueCollection nvc,
string key,
object value)
{
if (value is string || value.GetType().IsPrimitive)
{
nvc.Add(key, value.ToString());
}
else if (value is DateTime)
{
nvc.Add(key, ((DateTime)value).ToString("g"));
}
else
{
AddNonPrimitiveValue(nvc, key, value);
}
}
private static void AddNonPrimitiveValue(
NameValueCollection nvc,
string key,
object value)
{
var a = value as JArray;
if (a != null)
{
for (int i = 0; i < a.Count; i++)
AddKeyValuePair(nvc, key + "[" + i + "]", a[i]);
}
else
{
var v = value as JValue;
if (v != null)
{
AddKeyValuePair(nvc, key, v.Value);
}
else
{
var j = value as JObject;
if (j != null)
AddKeyValuePairs(nvc, j.ToObject<Dictionary<string, object>>(), key);
}
}
}
于 2019-10-09T20:11:51.803 回答