Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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.Net反序列化此json数据?_C#_.net_Json_Deserialization - Fatal编程技术网

C# 如何使用json.Net反序列化此json数据?

C# 如何使用json.Net反序列化此json数据?,c#,.net,json,deserialization,C#,.net,Json,Deserialization,我不知道如何定义data属性来反序列化以下json数据 { "response": { "total_rows": 39, "data": [ [ "XXXXXXXXXXXXXXXXXBs2VI", "a7ac4aa7-7211-4116-be57-0c36fc2abeee", "AAAAAA",

我不知道如何定义
data
属性来反序列化以下json数据

{
"response": {
    "total_rows": 39,
    "data": [
      [
        "XXXXXXXXXXXXXXXXXBs2VI",
        "a7ac4aa7-7211-4116-be57-0c36fc2abeee",
        "AAAAAA",
        "Crn Burnley & Victoria St",
        "Richmond",
        "VIC",
        "3121",
        "555-555-555",
        null,
        "Real Estate & Home Improvement > Storage",
        null,
        null,
        -37.8114511488511,
        145.009782837163
      ],
      [ .. ]
      [ .. ]
      ....
    },
    status = "ok"
}
所以我

public class ResultData
{
    public Response Response { get; set; }
    public string Status { get; set; }
}
还有

public class Response
{
    public int total_rows { get; set; }
    public IList<string> data { get; set; }
}
公共类响应
{
公共整数总计_行{get;set;}
公共IList数据{get;set;}
}
但这引发了一个异常,说
“不能将float转换为string”
。因此,它试图将最后两个浮动添加到
列表中。。但失败了

请问我该怎么修?(我无法控制json输出)

干杯:)

更新
看起来
data
json属性的内容是一个具有固定对象类型的固定大小数组。那么,有没有一种方法可以在我的.NET代码中定义它,让JSON.NET知道如何精确地反序列化它?是否需要为该json属性创建自定义json反序列化程序?

数组中有字符串和数字。您必须使用
对象
而不是
字符串
具有列表类型

public class Response
{
    public int total_rows { get; set; }
    public IList<object> data { get; set; }
}
公共类响应
{
公共整数总计_行{get;set;}
公共IList数据{get;set;}
}

看起来您有一个列表。在这种情况下,应该是:

public class Response
{
    public int total_rows { get; set; }
    public IList<IList<object>> data { get; set; }
}
公共类响应
{
公共整数总计_行{get;set;}
公共IList数据{get;set;}
}

正常-不确定这是否是最好的方法。。但是我是通过这样做来工作的

public class Response
{
    [JsonProperty(PropertyName = "total_rows")]
    public int TotalRows { get; set; }
    public IList<MyPoco> Data { get; set; }
}
公共类响应
{
[JsonProperty(PropertyName=“总计行”)]
公共整数TotalRows{get;set;}
公共IList数据{get;set;}
}
现在,JSON库不会自动填充数据属性。。。这是100%的罚款

然后我做这个

RestResponse<ResultData> response = client.Execute<ResultData>(restRequest);

ResultData data = response.Data;

if (data != null)
{
    // Now the Data property will be null, so we need to parse that badboy.
    JObject linqData = JObject.Parse(response.Content);
    var array = linqData["response"]["data"] as JArray;
    if (array != null)
    {
        data.Response.Data = 
            (from x in array
            select new MyPoco
                        {
                            SubjectKey = x[0].Value<string>(),
                            UUid = x[1].Value<string>(),
                            Name = x[2].Value<string>(),
                            Address = x[3].Value<string>(),
                            City = x[4].Value<string>(),
                            Territory = x[5].Value<string>(),
                            Postcode = x[6].Value<string>(),
                            Telephone = x[7].Value<string>(),
                            Category = x[9].Value<string>(),
                            Website = x[10].Value<string>(),
                            Email = x[11].Value<string>(),
                            Latitude = x[12].Value<float>(),
                            Longitude = x[13].Value<float>()
                        }).ToList();
    }
}
response response=client.Execute(restRequest);
结果数据=响应数据;
如果(数据!=null)
{
//现在数据属性将为null,因此我们需要解析那个坏小子。
JObject-linqData=JObject.Parse(response.Content);
var数组=作为JArray的linqData[“响应”][“数据”];
if(数组!=null)
{
data.Response.data=
(从阵列中的x开始)
选择新的MyPoco
{
SubjectKey=x[0]。值(),
UUid=x[1]。值(),
名称=x[2]。值(),
地址=x[3]。值(),
City=x[4]。值(),
Territory=x[5]。值(),
邮编=x[6]。值(),
电话=x[7]。值(),
类别=x[9]。值(),
网站=x[10]。值(),
Email=x[11]。值(),
纬度=x[12]。值(),
经度=x[13]。值()
}).ToList();
}
}
所以-我不允许JSON库自动提取列表对象。。但是我使用一些Linq来Json并提取那些坏家伙

不完全高兴。。但它是有效的

有人在网上

现在有一个随机可爱的猫咪图片


< P>如果使用.NET 4,那么在处理JSON时,您可能会考虑使用<代码>动态< /代码>。< /P> 我发布了一些代码,显示了一种设置方法

在您的示例中,您可以执行以下操作:

var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new DynamicJsonConverter() });

dynamic obj = serializer.Deserialize(json, typeof(object));

if (obj.status != "ok")
    throw new OopsException();

int rowCount = obj.total_rows;

foreach (var row in obj.data) {
    string code1 = row[0];
    string code2 = row[1];
    string code3 = row[2];
    string address = row[3];
    string suburb = row[4];
    string state = row[5];
    string postcode = row[6];
    string phone = row[7];
    string something1 = row[8];
    string name = row[9];
    string something2 = row[10];
    string something3 = row[11];
    decimal longitude = row[12];
    decimal latitude = row[13];

    // TODO use above values
}

不,没用。这就是我的调试数据的样子:我也尝试过(最初)。与此相同的错误,只是它在一个数组中:回滚Sif删除我的问候语!Shees--我们不是都经历过很多次了吗,伙计们?这很有趣,IMO:)所以这是在使用.NET库中内置的JavascriptSerializer,对吗?我正在使用第三方库RestSharp来处理调用返回JSON的RESTful服务的繁重任务。。在那沉重的负担中。。。它使用JSON.NET进行反序列化。我想知道是否可以定义反序列化服务。。是你的代码吗?@Pure.Krome,我不熟悉RestSharp或JSON.NET。在过去,我只是使用简单的WebRequests获取可以传递给上面所示的反序列化程序的响应字符串。这很简单,一旦你有了这样的助手。是的,它使用内置的JavaScriptSerializer。请注意,如果您大量迭代这些动态结构,那么如果您将所有数据一次性复制到强类型结构并从那里开始执行,您可能会发现性能更好。