我正在尝试将HTTPWebRequest响应(Json)反序列化为c#object / class,但遇到了麻烦。返回具有10个对象实例的集合,并且所有对象都为null。
这是json:
[
{
"id":2227,
"user_id":441,
"grades":
{"html_url":"https://...",
"current_score":91.26,
"current_grade":null,
},
"sis_account_id":"11",
"user":
{"id":441,
"name":"Nicholas Bailey",
}
},
以下是课程:
public class Grade
{
public string html_url { get; set; }
public decimal current_score { get; set; }
public string current_grade { get; set; }
}
public class User
{
public int id { get; set; }
public string name { get; set; }
}
public class Enrollment
{
public int id { get; set; }
public int user_id { get; set; }
public Grade grades { get; set; }
public string sis_account_id { get; set; }
public User user { get; set; }
}
public class RootObject
{
public Enrollment enrollment { get; set; }
}
这是我的代码:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://(some uri)");
WebResponse response = request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string content = sr.ReadToEnd();
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;
var outObject = JsonConvert.DeserializeObject<List<RootObject>>(content, settings);
我一直在谷歌上看很多代码,但没有找到一个接近我的情况。此外,我对泛型集合有点绿色。代码运行正常但在调试器中“outObject”包含10个条目,每个条目都有一个“Enrollment”对象为null。
我也尝试过这个有超过10个条目的json,但它仍然会出现10.但是我现在更专注于空值(一次一件事!)。为了简洁起见,我删除了json中的几个条目,但主模式(具有grade对象和嵌入其中的用户对象的注册对象)仍然存在。
非常感谢任何帮助。谢谢。
答案 0 :(得分:1)
反序列化为<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.kuba.myapplication3.MyListActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"
>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_dark"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="@string/txt_searching"
android:textColor="@android:color/white" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ButtonTxt" />
</LinearLayout>
<ListView
android:id="@+id/myList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:dividerHeight="1dp" />
</LinearLayout>
而非List<Enrollment>
:
List<RootObject>
根数组中的第一个JSON对象具有与var enrollment = JsonConvert.DeserializeObject<List<Enrollment>>(content, settings);
的成员对应的属性"id"
,"user_id"
等等。相反,JSON中没有任何属性Enrollment
。
示例fiddle。
<强>更新强>
你问,我试过这个,现在我得到一个例外“将值{null}转换为'System.Int32'的错误。路径'[0] .associated_user_id',第1行,第165位。 “为简洁起见,删除了associated_user_id,但我会将其添加回我的代码中。有什么想法吗?
您的数据模型必须具有以下成员(字段或属性):
"enrollment"
将此更改为可为空的:
public int associated_user_id;