. net用动态结构(模式)序列化JSON数据

本文关键字:序列化 JSON 数据 模式 动态 结构 net | 更新日期: 2023-09-27 17:54:38

我使用json数据消费响应的web服务

给出resultObject作为数组: resultObject:[{中的object1}, {object2},…如果有多个对象然后返回resultObject:{object1}如果只有一个对象。

我创建了一个"静态"的类结构来映射json模式。但如果在一种情况下,我有一个数组(列表)的对象,在另一种情况下,只有一个对象,怎么可能处理这种情况?

. net用动态结构(模式)序列化JSON数据

我已经找到了很多丑陋的解决方案来解决这个问题,但到目前为止:

如果你使用System.Web.Script.Serialization.JavaScriptSerializer,你有非常有限的控制。如果结果数据类型是简单的,您可以简单地使用DeserializeObject方法;它会将所有内容转换为Dictionary,而"resultObject"属性在第一种情况下将是Dictionary,而在后一种情况下将将其转换为字典的数组。这不会让你省去最后翻译的麻烦,但你可以把数据录入字典,这可以被认为是第一步。

我还尝试使用KnownTypes和DataContractJsonSerializer,但是数据契约序列化器需要以特殊命名的属性形式的"提示"来帮助它反序列化。(为什么我使用的KnownType属性是错误的?)如果你不能控制序列化的话这是一个没有希望的策略我猜你就是这种情况。

所以现在我们就只能选择那些丑陋的解决方案了,试错法是我的首选:当使用ScriptSerializer时,如果有任何错误,转换将以InvalidOperationException失败。然后我创建了两种数据类型,一种是数据作为数组,另一种是数据作为单个实例(DataClass是我的发明,因为您没有指定数据类型):

    [DataContract]
    public class DataClass
    {
        [DataMember]
        public string FirstName { get; set; }
        [DataMember]
        public int BirthYear { get; set; }
        public override string ToString()
        {
            return "FirstName : '" + FirstName + "', BirthYear: " + BirthYear;
        }
    }
    [DataContract]
    public class ResultSingle 
    {
        [DataMember]
        public DataClass Data { get; set; }
    }
    [DataContract]
    public class ResultArray 
    {
        [DataMember]
        public List<DataClass> Data { get; set; }
    }
使用这些数据类型,可以使用 进行转换
        JavaScriptSerializer jSer = new JavaScriptSerializer();
        var one = jSer.Deserialize<ResultSingle>(jsonWithSingleInstance);
        var many = jSer.Deserialize<ResultArray>(jsonWithArray);

但是这当然要求您事先知道数据类型,并且您会得到两种不同的结果类型。相反,您可以选择总是转换为ResultArray。如果你得到一个异常,你应该转换为ResultSingle,然后实例化ResultArray并手动将数据对象添加到data列表:

    static ResultArray ConvertJson(string json)
    {
        ResultArray fromJson;
        JavaScriptSerializer jSer = new JavaScriptSerializer();
        try
        {
            fromJson = jSer.Deserialize<ResultArray>(json);
            return fromJson;
        }
        catch (InvalidOperationException)
        {
            var single = jSer.Deserialize<ResultSingle> (json);
            fromJson = new ResultArray();
            fromJson.Data = new List<DataClass>();
            fromJson.Data.Add(single.Data);
            return fromJson;
        }
    }
    static void Main(string[] args)
    {
        var jsonWithSingleInstance = "{'"Data'":{'"FirstName'":'"Knud'",'"BirthYear'":1928}}";
        var jsonWithArray = "{'"Data'":[{'"FirstName'":'"Knud'",'"BirthYear'":1928},{'"FirstName'":'"Svend'",'"BirthYear'":1930}]}";
        var single = ConvertJson(jsonWithSingleInstance);
        var array = ConvertJson(jsonWithArray);
    }

我并不是说这是一个漂亮的解决方案(它不是),但它应该能起到作用。

你也可以看看json.net,它似乎是。net中json序列化器的选择:如何安装json。. NET使用NuGet?

嗯,我的服务提供商最后说这真的是一个bug。

http://jira.codehaus.org/browse/jettison - 102

表示这是因为他们使用的Java版本。