问题
I've got the following JSON:
{"workspaces":{ "workspace":[ {"name":"Berlin","href":"http://10.80.14.188:8080/geoserver/rest/workspaces/Berlin.json"}, {"name":"Paris","href":"http://10.80.14.188:8080/geoserver/rest/workspaces/Paris.json"}, {"name":"Rome","href":"http://10.80.14.188:8080/geoserver/rest/workspaces/Rome.json"}, {"name":"London","href":"http://10.80.14.188:8080/geoserver/rest/workspaces/London.json"}, {"name":"usa","href":"http://10.80.14.188:8080/geoserver/rest/workspaces/usa.json"}, {"name":"Lisboa","href":"http://10.80.14.188:8080/geoserver/rest/workspaces/Lisboa.json"}, {"name":"Madrid","href":"http://10.80.14.188:8080/geoserver/rest/workspaces/Madrid.json"} ]}}
The following class:
public class elementosJSON
{
[DataMember(Name = "name")]
public string name { get; set; }
[DataMember(Name = "href")]
public string href { get; set; }
}
And I´m trying to fill my class with the json but the elements are always null. I´m using:
ObjJSON test = JsonConvert.DeserializeObject<ObjJSON>(data);
My environment is Visual Studio 2010 C#.
Any ideas? I´m a newbie with C#.
回答1:
You need to create classes that represent the exact structure of your JSON. Something like:
class JsonObj // this class represents the main JSON object { ... }
{
public WorkspacesJson workspaces { get;set; }
}
class WorkspacesJson // this class represents the workspaces JSON object "workspaces": { ... }
{
public List<WorkspaceJson> workspace { get;set; } // this represents the JSON array "workspace": [ ... ]
}
class WorkspaceJson // this represents the name/value pair for the workspace JSON array { "name": ..., "href": ... }
{
public string name { get;set; }
public string href { get;set; }
}
Then you can deserialize:
var jsonInfo = JsonConvert.DeserializeObject<JsonObj>(data);
回答2:
Although this is not direct answer to your deserialization question; I prefer below method utilizing dynamic
instead of declaring a lot of classes
JObject o = (JObject)JsonConvert.DeserializeObject(jsonstr);
dynamic json = new JsonUtils.JsonObject(o);
foreach (var x in json.workspaces.workspace)
{
Console.WriteLine(x.name + " " + x.href);
}
Here is the full implementation of JsonObject class, I previously posted here
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Dynamic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
namespace JsonUtils
{
class JsonObject : DynamicObject, IEnumerable, IEnumerator
{
object _object;
public JsonObject(object jObject)
{
this._object = jObject;
}
public object this[int i]
{
get
{
if (!(_object is JArray)) return null;
object obj = (_object as JArray)[i];
if (obj is JValue)
{
return ((JValue)obj).ToString();
}
return new JsonObject(obj);
}
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = null;
if (_object is JArray && binder.Name == "Length")
{
result = (_object as JArray).Count;
return true;
}
JObject jObject = _object as JObject;
object obj = jObject.SelectToken(binder.Name);
if (obj is JValue)
result = ((JValue)obj).ToString();
else
result = new JsonObject(jObject.SelectToken(binder.Name));
return true;
}
public override string ToString()
{
return _object.ToString();
}
int _index = -1;
public IEnumerator GetEnumerator()
{
_index = -1;
return this;
}
public object Current
{
get
{
if (!(_object is JArray)) return null;
object obj = (_object as JArray)[_index];
if (obj is JValue) return ((JValue)obj).ToString();
return obj;
}
}
public bool MoveNext()
{
if (!(_object is JArray)) return false;
_index++;
return _index < (_object as JArray).Count;
}
public void Reset()
{
throw new NotImplementedException();
}
}
}
来源:https://stackoverflow.com/questions/7715635/problems-to-desearilize-a-json-my-class-is-always-null