C# 在C语言中解析JSON键值对#

C# 在C语言中解析JSON键值对#,c#,json,datacontractjsonserializer,C#,Json,Datacontractjsonserializer,关于 我试图在C#中解析以下内容,但在访问“rates”中的数据时遇到问题。我曾尝试将其反序列化为列表>或字典以及各种其他类型,结果总是为0。我设法让它工作的唯一方法是创建一个自定义类型,并将我需要的所有货币作为属性——这非常好 以下是我当前的数据合同: [DataContract] public class OpenExchangeRatesResult { public OpenExchangeRatesResult() { } [D

关于

我试图在C#中解析以下内容,但在访问“rates”中的数据时遇到问题。我曾尝试将其反序列化为列表>或字典以及各种其他类型,结果总是为0。我设法让它工作的唯一方法是创建一个自定义类型,并将我需要的所有货币作为属性——这非常好

以下是我当前的数据合同:

    [DataContract]
    public class OpenExchangeRatesResult
    {
        public OpenExchangeRatesResult() { }

        [DataMember]
        public string disclaimer { get; set; }

        [DataMember]
        public RatesObj rates { get; set; }

    }

    [DataContract]
    public class RatesObj
    {
        public RatesObj() { }
        [DataMember]
        public decimal EUR { get; set; }
        [DataMember]
        public decimal USD { get; set; }
        [DataMember]
        public decimal GBP { get; set; }
        [DataMember]
        public decimal AUD { get; set; }
        [DataMember]
        public decimal CAD { get; set; }
        [DataMember]
        public decimal CHF { get; set; }
        [DataMember]
        public decimal DKK { get; set; }
        [DataMember]
        public decimal LYD { get; set; }
        [DataMember]
        public decimal NZD { get; set; }
        [DataMember]
        public decimal SEK { get; set; }
        [DataMember]
        public decimal JPY { get; set; }
        [DataMember]
        public decimal ZAR { get; set; }
    }
我希望能够用某种集合来取代RatesObj


有什么想法吗?

试试JSon.Net,它是一个很棒的库

我正在使用(文档),这可能类似于DataContractJsonSerializer,但我刚刚用
字典替换了您的
RatesObj

[DataContract]
公开类开放交换率结果
{
公共OpenExchangeSResult(){}
[数据成员]
公共字符串免责声明{get;set;}
[数据成员]
公共字典率{get;set;}
}
和我的测试代码:

class Program
{
    static void Main(string[] args)
    {
        HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(@"https://raw.github.com/currencybot/open-exchange-rates/master/latest.json");
        wr.Timeout = 30 * 1000;
        HttpWebResponse response = (HttpWebResponse)wr.GetResponse();
        using (var s = new StreamReader(response.GetResponseStream()))
        {
            string json = s.ReadToEnd();

            var oerr = JsonConvert.DeserializeObject<OpenExchangeRatesResult>(json);

            Console.WriteLine(json);
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
HttpWebRequest wr=(HttpWebRequest)WebRequest.Create(@)https://raw.github.com/currencybot/open-exchange-rates/master/latest.json");
wr.超时=30*1000;
HttpWebResponse=(HttpWebResponse)wr.GetResponse();
使用(var s=newstreamreader(response.GetResponseStream())
{
字符串json=s.ReadToEnd();
var oerr=JsonConvert.DeserializeObject(json);
Console.WriteLine(json);
}
}
}
最后,rates属性包含150个字符串(货币名称)和小数(汇率)条目。希望这就是你想要的

我希望这有帮助。如果你还有其他问题,请告诉我,我会详细说明我的答案

祝你好运

(我想如果IEExtensibleDataObject可以用于这类事情会很好,但由于ExtensionDataObject是完全不透明的,所以它被明确禁止。当然,您可以使用反射提取内部字典,但如果这样做,则无法保证行为)

可以使用:JsonReaderWriterFactory.CreateJsonReader创建允许更动态模式的XmlReader对象。使用XmlReaders在大多数情况下都是痛苦的,所以我不能说这段代码是完美的,但也许它可以作为灵感

using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Net;
using System.Runtime.Serialization.Json;
using System.Xml;

namespace ConsoleApplication1
{

    class Program
    {
        static dynamic RecursiveBuildUp (XmlReader reader)
        {
            object result = null;
            while (reader.Read ())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        // TODO: It seems array elements are identified with the an "item" key
                        // This can create problems if the json object has a property name "item"
                        if (reader.LocalName == "item")
                        {
                            var list = result as List<object>;
                            if (list == null)
                            {
                                list = new List<object>();
                                result = list;
                            }
                            list.Add (RecursiveBuildUp (reader));
                        }
                        else
                        {
                            var dic = result as IDictionary<string, object>;
                            if (dic == null)
                            {
                                dic = new ExpandoObject ();
                                result = dic;
                            }
                            var localName = reader.LocalName;
                            dic[localName] = RecursiveBuildUp (reader);
                        }
                        break;
                    case XmlNodeType.Text:
                        result = reader.Value;
                        break;
                    case XmlNodeType.EndElement:
                        return result;
                    default:
                        throw new Exception ("Unhandled node type: " + reader.NodeType);
                }
            }
            return result;
        }

        static void Main (string[] args)
        {
            var wc = new WebClient ();
            var json = wc.DownloadData ("https://raw.github.com/currencybot/open-exchange-rates/master/latest.json");

            var quotas = new XmlDictionaryReaderQuotas ();
            var reader = JsonReaderWriterFactory.CreateJsonReader (json, quotas);

            var result = RecursiveBuildUp (reader);
            Console.WriteLine (result.root.rates.AED);
        }
    }
}
使用系统;
使用System.Collections.Generic;
运用系统动力学;
Net系统;
使用System.Runtime.Serialization.Json;
使用System.Xml;
命名空间控制台应用程序1
{
班级计划
{
静态动态递归构建(XmlReader)
{
对象结果=空;
while(reader.Read())
{
开关(reader.NodeType)
{
case XmlNodeType.Element:
//TODO:数组元素似乎是用“item”键标识的
//如果json对象的属性名为“item”,则会产生问题
如果(reader.LocalName==“项”)
{
var list=结果为列表;
if(list==null)
{
列表=新列表();
结果=列表;
}
添加(递归构建(读卡器));
}
其他的
{
var dic=结果作为索引;
如果(dic==null)
{
dic=新的扩展对象();
结果=dic;
}
var localName=reader.localName;
dic[localName]=递归构建(读卡器);
}
打破
案例XmlNodeType.Text:
结果=读卡器值;
打破
案例XmlNodeType.EndElement:
返回结果;
违约:
抛出新异常(“未处理的节点类型:+reader.NodeType”);
}
}
返回结果;
}
静态void Main(字符串[]参数)
{
var wc=新的WebClient();
var json=wc.DownloadData(“https://raw.github.com/currencybot/open-exchange-rates/master/latest.json");
var quotas=新的XmlDictionaryReaderQuotas();
var reader=JsonReaderWriterFactory.CreateJsonReader(json,配额);
var结果=递归累积(读取器);
Console.WriteLine(result.root.rates.AED);
}
}
}

我同意JSON.net的优越性,但这并不能真正回答他的问题。他希望摆脱RateObj,使用更具活力的东西。
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Net;
using System.Runtime.Serialization.Json;
using System.Xml;

namespace ConsoleApplication1
{

    class Program
    {
        static dynamic RecursiveBuildUp (XmlReader reader)
        {
            object result = null;
            while (reader.Read ())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        // TODO: It seems array elements are identified with the an "item" key
                        // This can create problems if the json object has a property name "item"
                        if (reader.LocalName == "item")
                        {
                            var list = result as List<object>;
                            if (list == null)
                            {
                                list = new List<object>();
                                result = list;
                            }
                            list.Add (RecursiveBuildUp (reader));
                        }
                        else
                        {
                            var dic = result as IDictionary<string, object>;
                            if (dic == null)
                            {
                                dic = new ExpandoObject ();
                                result = dic;
                            }
                            var localName = reader.LocalName;
                            dic[localName] = RecursiveBuildUp (reader);
                        }
                        break;
                    case XmlNodeType.Text:
                        result = reader.Value;
                        break;
                    case XmlNodeType.EndElement:
                        return result;
                    default:
                        throw new Exception ("Unhandled node type: " + reader.NodeType);
                }
            }
            return result;
        }

        static void Main (string[] args)
        {
            var wc = new WebClient ();
            var json = wc.DownloadData ("https://raw.github.com/currencybot/open-exchange-rates/master/latest.json");

            var quotas = new XmlDictionaryReaderQuotas ();
            var reader = JsonReaderWriterFactory.CreateJsonReader (json, quotas);

            var result = RecursiveBuildUp (reader);
            Console.WriteLine (result.root.rates.AED);
        }
    }
}