6

如何NameValueCollection简单地将 JSON 字符串转换为 C#,最好不使用 3rd 方解析器?

4

3 回答 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 回答