Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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
如何将JSON序列化为没有名称的C#类_C#_Json_Serialization - Fatal编程技术网

如何将JSON序列化为没有名称的C#类

如何将JSON序列化为没有名称的C#类,c#,json,serialization,C#,Json,Serialization,我从Toggl API收到了以下JSON数据: [ { "id": 1234567, "name": "My Workspace", "profile": 100, "premium": true, "admin": true, "default_hourly_rate": 1000, "default_currency": "USD", "only_admins_may_create_projects": true,

我从Toggl API收到了以下JSON数据:

[
  {
    "id": 1234567,
    "name": "My Workspace",
    "profile": 100,
    "premium": true,
    "admin": true,
    "default_hourly_rate": 1000,
    "default_currency": "USD",
    "only_admins_may_create_projects": true,
    "only_admins_see_billable_rates": true,
    "only_admins_see_team_dashboard": true,
    "projects_billable_by_default": true,
    "rounding": 0,
    "rounding_minutes": 0,
    "api_token": "some-api-token",
    "at": "2010-10-11T20:09:29+00:00",
    "logo_url": "https://assets.toggl.com/logos/i-am-awesome.png",
    "ical_url": "/ical/workspace_user/mr-awesome",
    "ical_enabled": true,
    "subscription": {
      "workspace_id": 0,
      "deleted_at": null,
      "created_at": "0001-01-01T00:00:00Z",
      "updated_at": null,
      "vat_valid": false,
      "vat_validated_at": null,
      "vat_invalid_accepted_at": null,
      "vat_invalid_accepted_by": null,
      "description": "Pro monthly",
      "vat_applicable": false
    }
  }
]
我用了方便的
粘贴专用。。。将JSON粘贴为Visual Studio 2015上的类
编辑菜单上的类,以获得以下类结构:

public class TogglWorkspaceTest
{

    public class Rootobject
    {
        public Class1[] Property1 { get; set; }
    }

    public class Class1
    {
        public int id { get; set; }
        public string name { get; set; }
        public int profile { get; set; }
        public bool premium { get; set; }
        public bool admin { get; set; }
        public int default_hourly_rate { get; set; }
        public string default_currency { get; set; }
        public bool only_admins_may_create_projects { get; set; }
        public bool only_admins_see_billable_rates { get; set; }
        public bool only_admins_see_team_dashboard { get; set; }
        public bool projects_billable_by_default { get; set; }
        public int rounding { get; set; }
        public int rounding_minutes { get; set; }
        public string api_token { get; set; }
        public DateTime at { get; set; }
        public string logo_url { get; set; }
        public string ical_url { get; set; }
        public bool ical_enabled { get; set; }
        public Subscription subscription { get; set; }
    }

    public class Subscription
    {
        public int workspace_id { get; set; }
        public object deleted_at { get; set; }
        public DateTime created_at { get; set; }
        public object updated_at { get; set; }
        public bool vat_valid { get; set; }
        public object vat_validated_at { get; set; }
        public object vat_invalid_accepted_at { get; set; }
        public object vat_invalid_accepted_by { get; set; }
        public string description { get; set; }
        public bool vat_applicable { get; set; }
    }

}
所以我的问题主要围绕
Rootobject
类中的
Property1
对象。我似乎无法将其正确映射,我认为这是因为JSON序列化试图将名称
Property1
与JSON中的某个名称匹配,但JSON中根本没有名称

我试着在每个类前面添加
[DataContract]
,在每个属性前面添加
[DataMember]
,但没有成功。我还尝试在
属性1
声明之前添加
[DataMember(Name=”“)]
,但这也不起作用

以下是我的序列化代码供参考:

    public static T MakeRequest<T>(string strUrl, string[][] strHeaders, string strRequestMethod = "GET") where T : class
    {
        // NOTE PARAMETERS ARE PASSED IN QUERYSTRING INSIDE URL

        try
        {
            HttpWebRequest request = WebRequest.Create(strUrl) as HttpWebRequest;
            request.Method = strRequestMethod;
            request.ContentType = "application/json";

            foreach (string[] strHeader in strHeaders)
            {
                request.Headers.Add(strHeader[0], strHeader[1]);
            }

            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            {
                if (response.StatusCode != HttpStatusCode.OK)
                    throw new Exception(String.Format(
                    "Server error (HTTP {0}: {1}).",
                    response.StatusCode,
                    response.StatusDescription));
                DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T));
                Stream stream = response.GetResponseStream();
                object objResponse = jsonSerializer.ReadObject(stream);
                var jsonResponse = (T)objResponse;
                response.Close();
                return jsonResponse;
            }
        }
        catch (Exception ex)
        {
            return default(T);
        }
    }
(多亏了@puropoix),我真正需要做的就是在
TogglWorkspaceTest.Class1

所以现在我有了这个,它工作得很好

        string[] strAuth = new string[] { "Authorization", $"Basic {strAuthCode}" };

        string[][] myHeaders = new string[][] { strAuth };

        TogglWorkspaceTest.Class1[] WorkspaceRequest = MakeRequest<TogglWorkspaceTest.Class1[]>("https://www.toggl.com/api/v8/workspaces", myHeaders);
    string[] strAuth = new string[] { "Authorization", $"Basic {strAuthCode}" };

    string[][] myHeaders = new string[][] { strAuth };

    TogglWorkspaceTest.Class1[] WorkspaceRequest = MakeRequest<TogglWorkspaceTest.Class1[]>("https://www.toggl.com/api/v8/workspaces", myHeaders);
string[]strAuth=newstring[]{“Authorization”,$“Basic{strAuthCode}”;
字符串[][]myHeaders=新字符串[][{strAuth};
TogglWorkspaceTest.Class1[]WorkspaceRequest=MakeRequest(“https://www.toggl.com/api/v8/workspaces“,myHeaders);

再次感谢@Proputinix

可能您可以使用匿名类型来反序列化json字符串。 这里有一个例子-

var定义=新的{Name=”“}

字符串json1=@“{'Name':'James'}”;var客户1= 反序列化匿名类型(json1,定义)

Console.WriteLine(customer1.Name);//詹姆斯

字符串json2=@“{'Name':'Mike'}”;var客户2= 反序列化匿名类型(json2,定义)

Console.WriteLine(customer2.Name)

上述示例的源代码是-

以下是一篇更详细的帖子-

假设您使用的是Json.NET,您可以使用以下通用形式:

var obj=JsonConvert.DeserializeObject(jsonString);

So@puropoix值得称赞,但所有内容都在评论中,因此我将此解决方案发布在这里,供其他人参考

我忘记分享的是我如何从程序调用
MakeRequest

        string[] strAuth = new string[] { "Authorization", $"Basic {strAuthCode}" };

        string[][] myHeaders = new string[][] { strAuth };

        TogglWorkspaceTest.Class1 WorkspaceRequest = MakeRequest<TogglWorkspaceTest.Class1>("https://www.toggl.com/api/v8/workspaces", myHeaders);
    string[] strAuth = new string[] { "Authorization", $"Basic {strAuthCode}" };

    string[][] myHeaders = new string[][] { strAuth };

    TogglWorkspaceTest.Class1 WorkspaceRequest = MakeRequest<TogglWorkspaceTest.Class1>("https://www.toggl.com/api/v8/workspaces", myHeaders);

再次感谢@Proputinix

我不确定这些课程是否匹配。该根对象在DTA中似乎没有对应项。在JSON.NET中运行良好,只是它是一个数组而已。问题似乎在于TOGGLAPI提供了一个JSON数组,而不仅仅是JSON本身。这可能是一个奇怪的问题,但是如何从表示为文本的单成员数组中提取JSON呢?
JavaScriptSerializer jss=new JavaScriptSerializer()
var myCol=jss.Deserialize(jstr)
将为您提供包含一些数据的Class1数组和包含更多道具的
订阅
属性
    string[] strAuth = new string[] { "Authorization", $"Basic {strAuthCode}" };

    string[][] myHeaders = new string[][] { strAuth };

    TogglWorkspaceTest.Class1[] WorkspaceRequest = MakeRequest<TogglWorkspaceTest.Class1[]>("https://www.toggl.com/api/v8/workspaces", myHeaders);