Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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# VSC中JSON反序列化失败#_C#_Json_Datacontractserializer_Json Deserialization - Fatal编程技术网

C# VSC中JSON反序列化失败#

C# VSC中JSON反序列化失败#,c#,json,datacontractserializer,json-deserialization,C#,Json,Datacontractserializer,Json Deserialization,使用VS 2012和C#,我试图从网站的api反序列化json响应数据,但序列化后得到空值。我尝试了几种不同的反序列化方法,它们都返回空值。如有任何建议,将不胜感激 详情如下: 示例JSON响应数据: {"response":{"metaInfo":{"timestamp":"2015-07-06T20:44:51Z","mapVersion":"8.30.58.159","moduleVersion":"7.2.58.0-1179","interfaceVersion":"2.6.13"},"

使用VS 2012和C#,我试图从网站的api反序列化json响应数据,但序列化后得到空值。我尝试了几种不同的反序列化方法,它们都返回空值。如有任何建议,将不胜感激

详情如下:

示例JSON响应数据:

{"response":{"metaInfo":{"timestamp":"2015-07-06T20:44:51Z","mapVersion":"8.30.58.159","moduleVersion":"7.2.58.0-1179","interfaceVersion":"2.6.13"},"route":[{"routeId":"AHAACAAAAB4AAAA6AAAAnwAAAJUAAAB42mOYysDAxMQABM6p7Z2hoaGpDFCQmBQqZsdib8Pw/z9E4MN+BiTABcThf3LOMDHk1U9A0ZgC1GjCiVdj3cKXQYxAi+GC/3s/ZruBJRvYgJSAHgBjgBtIVTckbg==","mode":{"type":"fastest","transportModes":["car"],"trafficMode":"enabled","feature":[]},"leg":[{"length":4014,"travelTime":612}]}],"language":"en-us"}}
using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
using Newtonsoft.Json;
using System.Xml;
using System.Xml.Serialization;
using System.Diagnostics;
using System.Net;

namespace JsonApiClient
{
    class Program
    {
        private const string baseUrl = "http://route.cit.api.here.com/routing/7.2/calculateroute.json?app_id={0}&app_code={1}&waypoint0={2}&waypoint1={3}&mode=fastest;car;traffic:enabled&avoidseasonalclosures=true&metricsystem=imperial&routeattributes=none,lg,ri&legattributes=none,le,tt";

        static void Main(string[] args)
        {
            String appid = "DemoAppId01082013GAL";
            String appcode = "AJKnXv84fjrb0KIHawS0Tg";
            String waypoint0 = "geo!52.5,13.4";
            String waypoint1 = "geo!52.5,13.45";

            // Customize URL according to geo location parameters
            String url = string.Format(baseUrl, appid, appcode, waypoint0, waypoint1);

            // Syncronous Consumption
            var syncClient = new WebClient();
            var content = syncClient.DownloadString(url);

            // visual display of content
            Console.WriteLine(content);

            //
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JSONResponseData));
            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(content)))
            {
                // deserialize the JSON object using the JSONResponseData type.
                var responseData = (JSONResponseData)serializer.ReadObject(ms);

                // Set breakpoint here to monitor responseData value
                Console.ReadLine();

            }
        }
    }
}
JSON数据类:

{"response":{"metaInfo":{"timestamp":"2015-07-06T20:44:51Z","mapVersion":"8.30.58.159","moduleVersion":"7.2.58.0-1179","interfaceVersion":"2.6.13"},"route":[{"routeId":"AHAACAAAAB4AAAA6AAAAnwAAAJUAAAB42mOYysDAxMQABM6p7Z2hoaGpDFCQmBQqZsdib8Pw/z9E4MN+BiTABcThf3LOMDHk1U9A0ZgC1GjCiVdj3cKXQYxAi+GC/3s/ZruBJRvYgJSAHgBjgBtIVTckbg==","mode":{"type":"fastest","transportModes":["car"],"trafficMode":"enabled","feature":[]},"leg":[{"length":4014,"travelTime":612}]}],"language":"en-us"}}
using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
using Newtonsoft.Json;
using System.Xml;
using System.Xml.Serialization;
using System.Diagnostics;
using System.Net;

namespace JsonApiClient
{
    class Program
    {
        private const string baseUrl = "http://route.cit.api.here.com/routing/7.2/calculateroute.json?app_id={0}&app_code={1}&waypoint0={2}&waypoint1={3}&mode=fastest;car;traffic:enabled&avoidseasonalclosures=true&metricsystem=imperial&routeattributes=none,lg,ri&legattributes=none,le,tt";

        static void Main(string[] args)
        {
            String appid = "DemoAppId01082013GAL";
            String appcode = "AJKnXv84fjrb0KIHawS0Tg";
            String waypoint0 = "geo!52.5,13.4";
            String waypoint1 = "geo!52.5,13.45";

            // Customize URL according to geo location parameters
            String url = string.Format(baseUrl, appid, appcode, waypoint0, waypoint1);

            // Syncronous Consumption
            var syncClient = new WebClient();
            var content = syncClient.DownloadString(url);

            // visual display of content
            Console.WriteLine(content);

            //
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JSONResponseData));
            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(content)))
            {
                // deserialize the JSON object using the JSONResponseData type.
                var responseData = (JSONResponseData)serializer.ReadObject(ms);

                // Set breakpoint here to monitor responseData value
                Console.ReadLine();

            }
        }
    }
}
我最初使用json2csharp.com转换从上面的json文本构建类结构。我将生成的类名重命名为JSONResponseData。后来,我在看到一个带有此符号的MSDN示例后添加了所有的[DataMember]条目。但无论是否使用[DataMember],返回的反序列化值都没有差异。更改生成的json类名也没有区别

using System.Collections.Generic;
using System.Runtime.Serialization;

namespace JsonApiClient
{
/// <summary>
/// Class to represent the JSONResponseData
/// </summary>
[DataContract]
public class JSONResponseData
{
    [DataMember]
    public string timestamp { get; set; }
    [DataMember]
    public string mapVersion { get; set; }
    [DataMember]
    public string moduleVersion { get; set; }
    [DataMember]
    public string interfaceVersion { get; set; }
}

public class Mode
{
    [DataMember]
    public string type { get; set; }
    [DataMember]
    public List<string> transportModes { get; set; }
    [DataMember]
    public string trafficMode { get; set; }
    [DataMember]
    public List<object> feature { get; set; }
}

public class Leg
{
    [DataMember]
    public int length { get; set; }
    [DataMember]
    public int travelTime { get; set; }
}

public class Route
{
    [DataMember]
    public string routeId { get; set; }
    [DataMember]
    public Mode mode { get; set; }
    [DataMember]
    public List<Leg> leg { get; set; }
}

public class Response
{
    [DataMember]
    public JSONResponseData metaInfo { get; set; }
    [DataMember]
    public List<Route> route { get; set; }
    [DataMember]
    public string language { get; set; }
}

public class RootObject
{
    [DataMember]
    public Response response { get; set; }
}
}

谢谢你的帮助

您使用了错误的类型,即JSONResponseData。在DataContractSerializer中使用RootObject作为类型,并在RootObject中强制转换结果

这是更新后的代码。我还包括了JSON.Net序列化,它比使用DataContractSerializer更快、更好

static void Main(string[] args)
{
    String appid = "DemoAppId01082013GAL";
    String appcode = "AJKnXv84fjrb0KIHawS0Tg";
    String waypoint0 = "geo!52.5,13.4";
    String waypoint1 = "geo!52.5,13.45";

    // Customize URL according to geo location parameters
    String url = string.Format(baseUrl, appid, appcode, waypoint0, waypoint1);

    // Syncronous Consumption
    var syncClient = new WebClient();
    var content = syncClient.DownloadString(url);

    // Using JSON.NET to deserialize object
     var responseDataSerialized = JsonConvert.DeserializeObject<RootObject>(content);

    // visual display of content
    Console.WriteLine(content);

    // Here's using DataContractSerializer
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(RootObject));
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(content)))
    {
        // deserialize the JSON object using the JSONResponseData type.
        var responseData = (RootObject)serializer.ReadObject(ms);

        // Set breakpoint here to monitor responseData value
        Console.ReadLine();

    }
}
static void Main(字符串[]args)
{
字符串appid=“DemoAppId01082013GAL”;
字符串appcode=“AJKnXv84fjrb0KIHawS0Tg”;
String waypoint0=“geo!52.5,13.4”;
String waypoint1=“geo!52.5,13.45”;
//根据地理位置参数自定义URL
String url=String.Format(baseUrl、appid、appcode、waypoint0、waypoint1);
//同步消费
var syncClient=new WebClient();
var content=syncClient.DownloadString(url);
//使用JSON.NET反序列化对象
var responseDataSerialized=JsonConvert.DeserializeObject(内容);
//内容的视觉显示
Console.WriteLine(内容);
//下面是使用DataContractSerializer
DataContractJsonSerializer serializer=新的DataContractJsonSerializer(typeof(RootObject));
使用(var ms=newmemoryStream(Encoding.Unicode.GetBytes(content)))
{
//使用JSONResponseData类型反序列化JSON对象。
var responseData=(RootObject)serializer.ReadObject(ms);
//在此处设置断点以监视responseData值
Console.ReadLine();
}
}

感谢您的宝贵见解!这解决了我的问题!您可以将此标记为答案。它也将帮助其他用户。