Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将json转换为NameValueCollection_C#_.net_Json - Fatal编程技术网

C# 如何将json转换为NameValueCollection

C# 如何将json转换为NameValueCollection,c#,.net,json,C#,.net,Json,如何简单地将JSON字符串转换为C#NameValueCollection,最好不使用第三方解析器?EDIT 没有第三方开发的纯.net解决方案具有以下外观: 利用 string jsonstring=@“{”“keyabc”“:”“valueabc”“keyxyz”“:”“valuexyz”“}”; 字典值= 反序列化对象(jsonstring); Check@jon answer suggest same:我不确定为什么每个人仍然推荐JSON.NET来反序列化JSON。我写了一封信 简而

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

EDIT

没有第三方开发的纯.net解决方案具有以下外观:


利用

string jsonstring=@“{”“keyabc”“:”“valueabc”“keyxyz”“:”“valuexyz”“}”;
字典值=
反序列化对象(jsonstring);

Check@jon answer suggest same:

我不确定为什么每个人仍然推荐JSON.NET来反序列化JSON。我写了一封信

简而言之,是这样的:

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.Script.Serialization;
var jss=新的JavaScriptSerializer();
var dict=jss.Deserialize(jsonText);
NameValueCollection nvc=null;
if(dict!=null){
nvc=新名称值集合(dict.Count);
foreach(dict中的变量k){
nvc.Add(k.Key,k.Value);
}
}
}
var json=jss.Serialize(dict);
Console.WriteLine(json);
请确保添加对System.Web.Extensions.dll的引用

注意:
我通常反序列化为
dynamic
,因此我假设
NameValueCollection
可以工作。但是,我还没有验证它是否真的存在。

如果您的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]"]);
以下是实施方案:

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);
        }
    }
}
私有静态void AddKeyValuePairs(
NameValueCollection nvc,
字典格言,
字符串前缀=空)
{
foreach(dict中的变量k)
{
var key=prefix==null?k.键:前缀+“[”+k.键+“]”;
如果(k.Value!=null)
AddKeyValuePair(nvc、键、k值);
}
}
私有静态void AddKeyValuePair(
NameValueCollection nvc,
字符串键,
对象值)
{
if(值为字符串| | value.GetType().IsPrimitive)
{
添加(key,value.ToString());
}
else if(值为DateTime)
{
nvc.Add(key,((DateTime)value).ToString(“g”);
}
其他的
{
添加非原始值(nvc、键、值);
}
}
私有静态void add非原始值(
NameValueCollection nvc,
字符串键,
对象值)
{
var a=作为JArray的值;
如果(a!=null)
{
for(int i=0;i
从这个答案中检查util类——他明确表示她不想使用第三方解析器。然而,JSON.NET的建议仍然很好,因为它是一个无处不在的库,可以解决.NET开发人员经常遇到的各种问题。@Jodrell-您可以免费访问link@PranayRana很多很多公司对生产产品中可能使用或不使用的东西有很多限制。例如,许多银行将要求所有开源解决方案都要经过许可证、安全性等方面的审查。这些过程可能需要数周或数月的时间,而他可能没有这样的时间!我知道,但它是一个第三方库。您好,这看起来很棒,我尝试了我从您那里写的:
public static NameValueCollection JSONToNVC(字符串json){JavaScriptSerializer jss;NameValueCollection nvc;jss=new JavaScriptSerializer();nvc=new NameValueCollection();试试看{nvc=jss.Deserialize(json);}catch{}return nvc;}
带有
{“status”:“error”,“message”:“Key无法给出”,“Key”:”}
但是
nvc
总是以空结尾,你能发现哪里出了问题吗?@James you是对的,原来的帖子根本不起作用。非常感谢JP Richardson的帖子和优秀的博客,现在只需要Dictionary=>NameValueCollection转换,但这是要走的路。必须注意的是,该博客的作者,截至20130325年,他改变了对第三方JSON库的看法,事实上称这种方法“过时”在引用的文章中。虽然不支持行业标准库,但他还是写了自己的,更喜欢原生的.NET JSON支持。我是这篇博客文章和这个答案的作者。我应该在你的注释中添加一个清晰的附录。这里介绍的这个方法是推荐的方法。我在调用这个方法的声明中缺乏上下文“过时的”。实际上,我根本不应该包括这句话,应该删除它。
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);
        }
    }
}