将JSON转换为c#类对象

本文关键字:对象 JSON 转换 | 更新日期: 2023-09-27 17:50:58

对不起,我不明白。这个过程对我来说似乎很简单,但无论我当前做什么,我都会得到一个带有null和0值的新对象。不会抛出错误。我已经尝试了几种将JSON转换为类对象的不同过程,但都没有效果。下面是我想使用的过程。如果你能告诉我为什么这个不行,我将不胜感激。

请注意:我必须使用匈牙利符号。我个人很讨厌它。

//Incoming JSON string to convert:
/*
{"MapPolicySnapshot":{"strMapPolicyID":"189931809","lngLayerTypeID":0,"lngSnapShotID":0,"intZoomLevel":11,"strLayers":",Co    unty,HighRisk,Section,CLU,Policy,Draw","strDateChanged":"","strExtent":"-11405656.02395,5258291.144358,-11353411.315124,5282215.934208"}}
*/
[Serializable]
[DataContract(Name = "MapPolicySnapshot")]
public class PolicySnapshot
{
    [DataMember(Name = "strMapPolicyID")]
    public string strMapPolicyID { get; set; }
    [DataMember(Name = "lngLayerTypeID")]
    public long lngLayerTypeID { get; set; }
    [DataMember(Name = "lngSnapshotID")]
    public int lngSnapShotID { get; set; }  //Not a typo. Former developer.
    [DataMember(Name = "intZoomLevel")]
    public int intZoomLevel { get; set; }
    [DataMember(Name = "strLayers")]
    public string strLayers { get; set; }
    [DataMember(Name = "strDateChanged")]
    public string strDateChanged { get; set; }
    [DataMember(Name = "strExtent")]
    public string strExtent { get; set; }
}
public class AController
{
    //All other code removed, and no, not the actual controller name
    private PolicySnapshot ConvertJSON(string snap)
    {
        // returns null and zeros
        //var snapShot = new JavaScriptSerializer().Deserialize<PolicySnapshot>(snap);
        var snapshot = DeserializeJSON<PolicySnapshot>(snap);
        return snapshot;
    }
    private T DeserializeJSON<T>(string json)
    {
        T obj = Activator.CreateInstance<T>();
        var ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
        var serializer = new DataContractJsonSerializer(obj.GetType());
        obj = (T)serializer.ReadObject(ms);
        ms.Close();
        return obj;
    }
}

当我用JSON字符串中的值创建PolicySnapshot类的新实例,然后进行序列化时,我得到

{"strMapPolicyID":"189931809","lngLayerTypeID":0,"lngSnapShotID":0,"intZoomLevel":11,"strLayers":",County,HighRisk,Section,CLU,Policy,Draw","strDateChanged":"","strExtent":"-11405656.02395,5258291.144358,-11353411.315124,5282215.934208"}

是相同的数据,减去类名。

将JSON转换为c#类对象

我个人使用RESTsharp,因为我发现它使序列化/反序列化非常直接。

例如,我可以用

反序列化一个对象

orderInfo = JsonConvert.DeserializeObject<OrderStatusInfo>(responseString);

获取你的类并将其转换为RESTsharp将看起来与你的类似,只是做了一些小改动:

public class MapPolicySnapshot
{
    [JsonProperty("strMapPolicyID")]
    public long PolicyID { get; set; }
    [JsonProperty("lngLayerTypeID")]
    public long LayerTypeID { get; set; }
    [JsonProperty("lngSnapshotID")]
    public int SnapShotID { get; set; }
    [JsonProperty("intZoomLevel")]
    public int ZoomLevel { get; set; }
    [JsonProperty("strLayers")]
    public string Layers { get; set; }
    [JsonProperty("strDateChanged")]
    public string DateChanged { get; set; }
    [JsonProperty("strExtent")]
    public string Extent { get; set; }
}

,然后执行如下操作:

MapPolicySnapshop snap = JsonConvert.DeserializeObject<MapPolicySnapshot>(responseString);

您可以尝试这样做:

    private object getClassFromJSon<T>(string JSon)
    {
        JavaScriptSerializer js = new JavaScriptSerializer();
        return js.Deserialize<T>(JSon);
    }

,像这样命名

var variableName = (MyClass)getClassFromJSon<MyClass>(JsonStringHere);