Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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# 使用dictionary以二进制方式序列化具有属性的Json对象_C#_Json_.net_Serialization - Fatal编程技术网

C# 使用dictionary以二进制方式序列化具有属性的Json对象

C# 使用dictionary以二进制方式序列化具有属性的Json对象,c#,json,.net,serialization,C#,Json,.net,Serialization,我需要用字典动态序列化对象的响应 留下json示例 我试图在c类中序列化这个响应对象(请求验证器) 但这是行不通的 有人能帮我吗,有什么想法吗 { “人”:{ “测试”:“CC”, “简单”:“1234545”, “错误名称”:{ “id”:“655789”, “错误”:“简单” }, “errorColor”:{ “id”:“2”, “错误”:“错误颜色” } } } { “请求验证程序”:[ { “person.errorNames”:[ “错误名称” ], “person.errorCol

我需要用字典动态序列化对象的响应 留下json示例 我试图在c类中序列化这个响应对象(请求验证器) 但这是行不通的 有人能帮我吗,有什么想法吗

{
“人”:{
“测试”:“CC”,
“简单”:“1234545”,
“错误名称”:{
“id”:“655789”,
“错误”:“简单”
},
“errorColor”:{
“id”:“2”,
“错误”:“错误颜色”
}
}
}
{
“请求验证程序”:[
{
“person.errorNames”:[
“错误名称”
],
“person.errorColor”:[
“错误颜色”
]
}
]
}
公共类反序列化响应{
公共字典请求\验证程序{get;set;}
}
var error=JsonConvert.DeserializeObject(内容);

var error=JsonSerializer.Deserialize(内容);

您可以使用Newtonsoft.Json库将字符串数组中的所有属性获取到字典中

在这种情况下,您只需要指向搜索的级别

using Newtonsoft.Json.Linq;
...
            JObject validator = JObject.Parse(content);
            IJEnumerable<JToken> validatorTokens = validator.SelectTokens("request_validator")?.Values();
            Dictionary<string, List<string>> errors = new Dictionary<string, List<string>>();
            if (validatorTokens != null)
            {
                foreach (JProperty prop in validatorTokens.Values())
                {
                    if (!errors.ContainsKey(prop.Name))
                    {
                        errors.Add(prop.Name, new List<string>());
                    }
                    errors[prop.Name].Add(prop.Value?.ToString());
                }
            }
使用Newtonsoft.Json.Linq;
...
JObject validator=JObject.Parse(内容);
IJEnumerable validatorTokens=验证器。选择Tokens(“请求验证器”)?.Values();
字典错误=新建字典();
if(验证令牌!=null)
{
foreach(validatorTokens.Values()中的JProperty属性)
{
如果(!errors.ContainsKey(prop.Name))
{
添加(prop.Name,new List());
}
错误[prop.Name]。添加(prop.Value?.ToString());
}
}

这是否回答了您的问题
public List RequestValidator{get;set;}
,属性名称后的第一个图表是一个
[
用于列表/数组。因此RequestValidator不是一个dict。它是一个包含该dict的列表。
“request\u validator”
是对象数组,而不是对象。字典通常是从对象映射而来的。您好,谢谢您的回答,victor是一个很好的做法吗?因为响应错误是动态的{[JsonPropertyName(“person.ErrorName”)]公共字符串[]PersonErrorNames{get;set;}[JsonPropertyName(“person.errorColor”)]公共字符串[]PersonErrorColor{get;set;}[JsonPropertyName(“person.errorX”)]公共字符串[]PersonErrorX{get;set;}[JsonPropertyName(“person.errorY”)]公共字符串[]PersonErrorY{get;set;}[JsonPropertyName(“person.errorZ”)]公共字符串[]PersonErrorZ{get;set;}您好,victor,谢谢您的回答,如何为RequestValidator类动态创建这些属性,以便不重复代码,这是可能的吗?如果我们不指定json属性,json序列化程序将不允许我们读取值。如果json中的属性是动态的,那么这种方法将不起作用,但是如果有很多属性和它们不会改变,然后您可以使用服务()生成类
public class DeserializeResponse
{
    [JsonPropertyName("request_validator")]
    public RequestValidator[] RequestValidator { get; set; }
}

public class RequestValidator
{
    [JsonPropertyName("person.errorNames")]
    public string[] PersonErrorNames { get; set; }

    [JsonPropertyName("person.errorColor")]
    public string[] PersonErrorColor { get; set; }
}
var error = JsonSerializer.Deserialize<DeserializeResponse>(content);
using Newtonsoft.Json.Linq;
...
            JObject validator = JObject.Parse(content);
            IJEnumerable<JToken> validatorTokens = validator.SelectTokens("request_validator")?.Values();
            Dictionary<string, List<string>> errors = new Dictionary<string, List<string>>();
            if (validatorTokens != null)
            {
                foreach (JProperty prop in validatorTokens.Values())
                {
                    if (!errors.ContainsKey(prop.Name))
                    {
                        errors.Add(prop.Name, new List<string>());
                    }
                    errors[prop.Name].Add(prop.Value?.ToString());
                }
            }