Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
使用JsonConvert.DeserializeObject将Json反序列化为C#POCO类_C#_Json_Serialization_Json.net_Poco - Fatal编程技术网

使用JsonConvert.DeserializeObject将Json反序列化为C#POCO类

使用JsonConvert.DeserializeObject将Json反序列化为C#POCO类,c#,json,serialization,json.net,poco,C#,Json,Serialization,Json.net,Poco,这是我的简单的UserPOCO类: // ///User类表示Coderwall用户。 /// 公共类用户 { /// ///用户的用户名。例如:“sergiotapia、Mrkibles、matumbo” /// 公共字符串用户名{get;set;} /// ///用户名。例如:“塞尔吉奥·塔皮亚、约翰·科萨克、露西·麦克米兰” /// 公共字符串名称{get;set;} /// ///用户的位置。呃:“玻利维亚、美国、法国、意大利” /// 公共字符串位置{get;set;}

这是我的简单的
User
POCO类:

//
///User类表示Coderwall用户。
/// 
公共类用户
{
/// 
///用户的用户名。例如:“sergiotapia、Mrkibles、matumbo”
/// 
公共字符串用户名{get;set;}
/// 
///用户名。例如:“塞尔吉奥·塔皮亚、约翰·科萨克、露西·麦克米兰”
/// 
公共字符串名称{get;set;}
/// 
///用户的位置。呃:“玻利维亚、美国、法国、意大利”
/// 
公共字符串位置{get;set;}
公共整数背书{get;set;}//Todo。
公共字符串团队{get;set;}//Todo。
/// 
///用户链接帐户的集合。
/// 
公众名单):

private User LoadUserFromJson(字符串响应)
{
var outObject=JsonConvert.DeserializeObject(响应);
返回对象;
}
这引发了一个异常:

无法反序列化当前JSON对象(例如{“名称”:“值”}) 打字 'System.Collections.Generic.List'1[CoderwallDotNet.Api.Models.Account]' 因为该类型需要一个JSON数组(例如[1,2,3])来反序列化 没错

要修复此错误,请将JSON更改为JSON数组 (例如[1,2,3])或更改反序列化类型,使其成为正常类型 .NET类型(例如,不是integer之类的基元类型,也不是集合 可以从JSON反序列化的类型(如数组或列表) 还可以将object.JsonObjectAttribute添加到类型以强制它 要从JSON对象.Path“accounts.github”第1行反序列化, 第129位

我以前从未使用过这个反序列化对象方法,所以我被困在这里了

我已经确保POCO类中的属性名称与JSON响应中的名称相同


如何将JSON反序列化到此POCO类中?

accounts属性的定义如下:

"accounts":{"github":"sergiotapia"}
class Account {
    public string github { get; set; }
}
您的POCO声明如下:

public List<Account> Accounts { get; set; }
项目数组(将映射到列表)始终用方括号括起来

编辑:账户Poco如下:

"accounts":{"github":"sergiotapia"}
class Account {
    public string github { get; set; }
}
也许还有其他财产

编辑2:要不使用数组,请按如下方式使用属性:

public Account Accounts { get; set; }
类似于我在第一次编辑中发布的示例类

to fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the
deserialized type so that it is a normal .NET type (e.g. not a primitive type like
integer, not a collection type like an array or List) that can be deserialized from a
JSON object.`
整个消息表明可以序列化为列表对象,但输入必须是JSON列表。 这意味着您的JSON必须包含

"accounts" : [{<AccountObjectData}, {<AccountObjectData>}...],
其中accounts是一个JSON对象(用花括号表示),而不是一个JSON对象数组(数组用括号表示),这正是您想要的。请尝试

"accounts" : [{"github":"sergiotapia"}]

您可以创建一个
JsonConverter
。有关与您的问题类似的示例,请参阅。

以下是一个工作示例

重点是:

  • 账户声明
  • 使用
    JsonProperty
    属性

使用(WebClient wc=new WebClient())
{
var json=wc.DownloadString(“http://coderwall.com/mdeiters.json");
var user=JsonConvert.DeserializeObject(json);
}
-

公共类用户
{
/// 
///用户的用户名。例如:“sergiotapia、Mrkibles、matumbo”
/// 
[JsonProperty(“用户名”)]
公共字符串用户名{get;set;}
/// 
///用户名。例如:“塞尔吉奥·塔皮亚、约翰·科萨克、露西·麦克米兰”
/// 
[JsonProperty(“名称”)]
公共字符串名称{get;set;}
/// 
///用户的位置。呃:“玻利维亚、美国、法国、意大利”
/// 
[JsonProperty(“位置”)]
公共字符串位置{get;set;}
[JsonProperty(“背书”)]
公共整数背书{get;set;}//Todo。
[JsonProperty(“团队”)]
公共字符串团队{get;set;}//Todo。
/// 
///用户链接帐户的集合。
/// 
[JsonProperty(“账户”)]
公共帐户帐户{get;set;}
/// 
///用户授予的徽章的集合。
/// 
[JsonProperty(“徽章”)]
公共列表标记{get;set;}
}
公共类帐户
{
公共字符串github;
}
公众阶级徽章
{
[JsonProperty(“名称”)]
公共字符串名称;
[JsonProperty(“描述”)]
公共字符串描述;
[JsonProperty(“已创建”)]
创建公共字符串;
[JsonProperty(“徽章”)]
公共字符串地址;
}

另一种更简化的方法是使用

它是Newtonsoft.Json.Serialization命名空间的一部分。这种方法假定Json对象和POCO之间的唯一区别在于属性名的大小写。如果属性名拼写不同,则需要使用JsonProperty属性来映射属性名

using Newtonsoft.Json; 
using Newtonsoft.Json.Serialization;

. . .

private User LoadUserFromJson(string response) 
{
    JsonSerializerSettings serSettings = new JsonSerializerSettings();
    serSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    User outObject = JsonConvert.DeserializeObject<User>(jsonValue, serSettings);

    return outObject; 
}
使用Newtonsoft.Json;
使用Newtonsoft.Json.Serialization;
. . .
私有用户LoadUserFromJson(字符串响应)
{
JsonSerializerSettings serSettings=新的JsonSerializerSettings();
serSettings.ContractResolver=新的CamelCasePropertyNamesContractResolver();
用户outObject=JsonConvert.DeserializeObject(jsonValue,serSettings);
返回对象;
}

这不是我想要的。如果只有在运行时才知道泛型类型,你会怎么做

public MyDTO toObject() {
  try {
    var methodInfo = MethodBase.GetCurrentMethod();
    if (methodInfo.DeclaringType != null) {
      var fullName = methodInfo.DeclaringType.FullName + "." + this.dtoName;
      Type type = Type.GetType(fullName);
      if (type != null) {
        var obj = JsonConvert.DeserializeObject(payload);
      //var obj = JsonConvert.DeserializeObject<type.MemberType.GetType()>(payload);  // <--- type ?????
          ...
      }
    }

    // Example for java..   Convert this to C#
    return JSONUtil.fromJSON(payload, Class.forName(dtoName, false, getClass().getClassLoader()));
  } catch (Exception ex) {
    throw new ReflectInsightException(MethodBase.GetCurrentMethod().Name, ex);
  }
}
public MyDTO toObject(){
试一试{
var methodInfo=MethodBase.GetCurrentMethod();
if(methodInfo.DeclaringType!=null){
var fullName=methodInfo.DeclaringType.fullName+“+this.dtoName;
Type Type=Type.GetType(全名);
if(type!=null){
var obj=JsonConvert.DeserializeObject(有效负载);

//var obj=JsonConvert.DeserializeObject(payload);//根据接受的答案,如果您有一个JSON文本示例,您可以将其插入其中,选择您的选项并生成C代码

如果您在运行时不知道该类型,则本主题似乎适合

只需定义属性n
using Newtonsoft.Json; 
using Newtonsoft.Json.Serialization;

. . .

private User LoadUserFromJson(string response) 
{
    JsonSerializerSettings serSettings = new JsonSerializerSettings();
    serSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    User outObject = JsonConvert.DeserializeObject<User>(jsonValue, serSettings);

    return outObject; 
}
public MyDTO toObject() {
  try {
    var methodInfo = MethodBase.GetCurrentMethod();
    if (methodInfo.DeclaringType != null) {
      var fullName = methodInfo.DeclaringType.FullName + "." + this.dtoName;
      Type type = Type.GetType(fullName);
      if (type != null) {
        var obj = JsonConvert.DeserializeObject(payload);
      //var obj = JsonConvert.DeserializeObject<type.MemberType.GetType()>(payload);  // <--- type ?????
          ...
      }
    }

    // Example for java..   Convert this to C#
    return JSONUtil.fromJSON(payload, Class.forName(dtoName, false, getClass().getClassLoader()));
  } catch (Exception ex) {
    throw new ReflectInsightException(MethodBase.GetCurrentMethod().Name, ex);
  }
}