如何将JSON序列化为没有名称的C#类
我从Toggl API收到了以下JSON数据:如何将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,
[
{
"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);