Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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可以';无法反序列化到对象,是否需要数组?_C#_Json_Windows Phone 7_Windows Phone 7.1_Windows Phone - Fatal编程技术网

C# JSON可以';无法反序列化到对象,是否需要数组?

C# JSON可以';无法反序列化到对象,是否需要数组?,c#,json,windows-phone-7,windows-phone-7.1,windows-phone,C#,Json,Windows Phone 7,Windows Phone 7.1,Windows Phone,我试图获取传入的JSON项并将它们绑定到listbox项,但VisualStudio告诉我需要执行数组而不是对象?我从来没有这样做过。。。有人知道怎么做吗 我的根对象: public class RootObject { public string url { get; set; } public string display { get; set; } public List<string> genetics { get; set; } public

我试图获取传入的JSON项并将它们绑定到listbox项,但VisualStudio告诉我需要执行数组而不是对象?我从来没有这样做过。。。有人知道怎么做吗

我的根对象:

public class RootObject
{
    public string url { get; set; }
    public string display { get; set; }
    public List<string> genetics { get; set; }
    public List<string> price { get; set; }
    public List<string> brandMaker { get; set; }
    public string form { get; set; }
    public string dosornos { get; set; }
    public string qty { get; set; }
    public string mfg { get; set; }
    public string mobURI { get; set; }
}
JSON文件/请求基本结果:

  [
{
    "url": "N/A",
    "display": "",
    "genetics": [
        "microogiz"
    ],
    "price": [
        "96.016"
    ],
    "brandMaker": [
        "Oshi Kunti Multikashi, Osaka, JP"
    ],
    "form": "tangent",
    "dosornos": "n/a",
    "qty": "88G",
    "mfg": "SelfMade Industries, USA Dist.",
    "mobURI": "n/a"
}
]

我的原始代码:

// Get JSON via WEB
string ProviderURI = goURI;
webClient webClient = new WebClient();
webClient.DownloadStringCompleted += new  
    DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
webClient.DownloadStringAsync(new Uri(ProviderURI));

void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    if (e.Error != null)
    {
        return;
    }

    var deserializedJSON = JsonConvert.DeserializeObject<RootObject>(e.Result);
    lstBoxResults.ItemsSource = deserializedJSON; // or deserializedJSON.url.ToString();
}
//通过WEB获取JSON
字符串ProviderURI=goURI;
webClient webClient=新的webClient();
webClient.DownloadStringCompleted+=新建
DownloadStringCompletedEventHandler(webClient\u DownloadStringCompleted);
下载StringAsync(新Uri(ProviderURI));
void webClient_DownloadStringCompleted已完成(对象发送方,DownloadStringCompletedEventArgs e)
{
如果(例如错误!=null)
{
返回;
}
var deserializedJSON=JsonConvert.DeserializeObject(e.Result);
lstBoxResults.ItemsSource=deserializedJSON;//或deserializedJSON.url.ToString();
}

好的,您提到genetics和price是数组,但返回的JSON只包含一项。RootObject的其余部分是简单的字符串属性

因为您没有发布原始JSON示例。让我提出一个精简版本,使事情简单和简短

{
    "url": "http://www.stackoverflow.com",
    "display": "This is a test",
    "genetics": [
        "typeophere"
    ],
    "price": [
        "$1400"
    ],
    "form": "a form"
}
现在我们可以减少RootObject类的类型。我对属性使用Pascal大小写,并用JSON.NET属性对它们进行属性化,以帮助进行反序列化/序列化

[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class RootObject
{
    [JsonProperty(PropertyName = "url")]
    public string Url { get; set; }

    [JsonProperty(PropertyName = "display")]
    public string Display { get; set; }

    [JsonProperty(PropertyName = "genetics")]
    public List<string> Genetics { get; set; }

    [JsonProperty(PropertyName = "price")]
    public List<string> Price { get; set; }

    [JsonProperty(PropertyName = "form")]
    public string Form { get; set; }
}
只需将此部分替换为WebClient调用以获取JSON数据

现在我们可以将JSON反序列化为一个RootObject实例

var rootObject = JsonConvert.DeserializeObject<RootObject>(json);
这是行不通的。无法将RootObject实例转换为System.Collections.IEnumerable。这正是ItemsSource所期待的

容易解决。让我们创建一个集合

lstBoxResults.ItemsSource = new List<RootObject> { rootObject };
反序列化同样容易。使用JSON.NET获取RootObjects的集合

var data = JObject.Parse(json)["items"];
现在反序列化为一个集合(IEnumerable)

您收到的JSON数据似乎无效。在解析它之前,请确保对它进行了修改,以获得有效的JSON对象

例如:

json = json.Substring(json.IndexOf("[") + 1);
json = json.Substring(0, json.LastIndexOf("]"));
var rootObjects = JsonConvert.DeserializeObject<RootObject>(json);
json=json.Substring(json.IndexOf(“[”)+1);
json=json.Substring(0,json.LastIndexOf(“]);
var rootObjects=JsonConvert.DeserializeObject(json);
试试这个

RootObject rootObject;

if (json.startsWith("["))
{
  rootObject = JsonConvert.DeserializeObject<List<RootObject>>(json)[0];
}
else
{
  rootObject = JsonConvert.DeserializeObject<RootObject>(json);
}
RootObject-RootObject;
if(json.startsWith(“[”))
{
rootObject=JsonConvert.DeserializeObject(json)[0];
}
其他的
{
rootObject=JsonConvert.DeserializeObject(json);
}

你能发布古里返回的原始JSON吗?请发布一个原始JSON响应。这只是一个提示,但要开始使用适当的大小写,例如属性的Pascal大小写。局部变量的Camel大小写…等等。我想你得到了字符串的回报…首先将该字符串解析为JSON,然后反序列化它。dbaseman&Christophe Geers I just添加了它。首先,非常感谢您的帮助!不过我确实有一个问题…在我请求JSON文件并告诉它转到下载StringCompleted后,我运行:“var rootObject=JsonConvert.DeserializeObject(e.Result);pillResults.ItemsSource=new List{rootObject}”;甚至使用您的类也会出现以下错误:无法将当前JSON数组(例如[1,2,3])反序列化为“HealthCenter.MainPage+RootObject”类型,因为该类型需要一个JSON对象(例如{“name”:“value”})才能正确反序列化。请将JSON更改为JSON对象(例如{“name”:“value”})更改为arrayWell,您在问题中显示的JSON响应无效。如果我尝试解析该响应,则会出现相同的异常。请删除括号[]你可以解析一个有效的JSON对象。不过它只是一个RootObject。嗨,Christophe,不幸的是,我认为公司还不会让我更改它们,但我会提交一个副本。它可以在我们的iOS设备上工作,但奇数WP7无法完成。再次感谢你的帮助!你将JSON数据作为一个字符串接收。请继续在使用JSON.NET库解析之前更正它。并不是说你应该去修复提供它的web服务。很遗憾,如果/选中将rootObject添加到Listboxs itemssource,那么第一步就不能成功,但这没关系。唯一的另一个问题是,如果我正在使用say、brandMaker和do rootObject.brandMaker进行操作,我必须添加。到String();但不显示,它显示System.Collections…无论哪种方式,都适用于某些项目,太棒了,谢谢!
{
    "items": [
    {
    "url": "http://www.stackoverflow.com",
    "display": "This is a test",
    "genetics": [ "typeophere" ],
    "price": [ "$1400" ],
    "form": "a form"        
    },
    {
    "url": "http://cgeers.com",
    "display": "This is another test",
    "genetics": [ "typeophere" ],
    "price": [ "$2000" ],
    "form": "another form"
    }]
}
var data = JObject.Parse(json)["items"];
var rootObjects = JsonConvert.DeserializeObject<IEnumerable<RootObject>>(data.ToString());
lstBoxResults.ItemsSource = rootObjects;
json = json.Substring(json.IndexOf("[") + 1);
json = json.Substring(0, json.LastIndexOf("]"));
var rootObjects = JsonConvert.DeserializeObject<RootObject>(json);
RootObject rootObject;

if (json.startsWith("["))
{
  rootObject = JsonConvert.DeserializeObject<List<RootObject>>(json)[0];
}
else
{
  rootObject = JsonConvert.DeserializeObject<RootObject>(json);
}