Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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序列化_C#_Json_Serialization - Fatal编程技术网

C# 具有动态结构(模式)的JSON数据.NET序列化

C# 具有动态结构(模式)的JSON数据.NET序列化,c#,json,serialization,C#,Json,Serialization,我使用的web服务使用json数据响应 它将resultObject作为数组提供: resultObject:[{object1},{object2},…]如果有多个对象 它回来了 resultObject:{object1}如果只有一个对象 为了在.NET中序列化,我创建了一个类的“静态”结构来映射json模式。但是,如果在一种情况下,我有一个对象数组(列表),而在另一种情况下,只有一个对象,那么如何处理这种情况呢?我已经找到了很多丑陋的解决方案,但到目前为止: 如果使用System.Web.

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

它将resultObject作为数组提供: resultObject:[{object1},{object2},…]如果有多个对象 它回来了 resultObject:{object1}如果只有一个对象


为了在.NET中序列化,我创建了一个类的“静态”结构来映射json模式。但是,如果在一种情况下,我有一个对象数组(列表),而在另一种情况下,只有一个对象,那么如何处理这种情况呢?

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

如果使用
System.Web.Script.Serialization.JavaScriptSerializer
,则控制非常有限。如果结果数据类型很简单,您可以简单地使用
反序列化对象
方法;它会将所有内容转换为Dictionary,“resultObject”属性在第一种情况下是Dictionary,而在后一种情况下则会将其转换为此类Dictionary的数组。这不会让你省去最后翻译的麻烦,但你会把数据输入字典,这可以看作是第一步

我还尝试使用KnownTypes和DataContractJsonSerializer,但遗憾的是DataContractSerializer需要特殊命名属性形式的“提示”来帮助其反序列化。(). 如果您不能控制序列化,那么这是一个没有希望的策略,我想您应该是这样的

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

[DataContract]
公共类数据类
{
[数据成员]
公共字符串名{get;set;}
[数据成员]
公共整数生日{get;set;}
公共重写字符串ToString()
{
返回“FirstName:”+“FirstName+”,生日:“+生日;
}
}
[数据合同]
公共类结果表
{
[数据成员]
公共数据类数据{get;set;}
}
[数据合同]
公共类结果数组
{
[数据成员]
公共列表数据{get;set;}
}
使用这些数据类型,可以使用

        JavaScriptSerializer jSer = new JavaScriptSerializer();
        var one = jSer.Deserialize<ResultSingle>(jsonWithSingleInstance);
        var many = jSer.Deserialize<ResultArray>(jsonWithArray);
JavaScriptSerializer jSer=newJavaScriptSerializer();
var one=jSer.Deserialize(jsonWithSingleInstance);
var many=jSer.Deserialize(jsonWithArray);
但这当然需要您事先知道数据类型,然后您会得到两种不同的结果类型。相反,您可以选择始终转换为ResultArray。如果出现异常,应将其转换为Resultingle,然后实例化ResultArray并手动将数据对象添加到数据列表中:

    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);
    }
static ResultArray ConvertJson(字符串json)
{
结果来自JSON;
JavaScriptSerializer jSer=新的JavaScriptSerializer();
尝试
{
fromJson=jSer.Deserialize(json);
从JSON返回;
}
捕获(无效操作异常)
{
var single=jSer.Deserialize(json);
fromJson=new ResultArray();
fromJson.Data=new List();
fromJson.Data.Add(single.Data);
从JSON返回;
}
}
静态void Main(字符串[]参数)
{
var jsonWithSingleInstance=“{\'Data\':{\'FirstName\':\'Knud\',\'BirthYear\':1928}”;
var jsonWithArray=“{\'数据\':[{\'名字\':\'Knud\,\'出生年份\':1928},{\'名字\':\'Svend\,\'出生年份\':1930}];
var single=ConvertJson(jsonWithSingleInstance);
var-array=ConvertJson(jsonWithArray);
}
我并不是说这是一个很好的解决方案(其实不是),但它应该可以做到这一点


您还可以看看json.net,它似乎是.net中选择的json序列化程序:

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

如果使用
System.Web.Script.Serialization.JavaScriptSerializer
,则控制非常有限。如果结果数据类型很简单,您可以简单地使用
反序列化对象
方法;它会将所有内容转换为Dictionary,“resultObject”属性在第一种情况下是Dictionary,而在后一种情况下则会将其转换为此类Dictionary的数组。这不会让你省去最后翻译的麻烦,但你会把数据输入字典,这可以看作是第一步

我还尝试使用KnownTypes和DataContractJsonSerializer,但遗憾的是DataContractSerializer需要特殊命名属性形式的“提示”来帮助其反序列化。(). 如果您不能控制序列化,那么这是一个没有希望的策略,我想您应该是这样的

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

[DataContract]
公共类数据类
{
[数据成员]
公共字符串名{get;set;}
[数据成员]
公共整数生日{get;set;}
公共重写字符串ToString()
{
返回“FirstName:”+“FirstName+”,生日:“+生日;
}
}
[数据合同]
公共类结果表
{
[数据成员]
公共数据类数据{get;set;}
}
[数据合同]
公共类结果数组
{
    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);
    }