Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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# JsonConvert反序列化对象区分大小写_C#_Json_Serialization_Deserialization_Case Sensitive - Fatal编程技术网

C# JsonConvert反序列化对象区分大小写

C# JsonConvert反序列化对象区分大小写,c#,json,serialization,deserialization,case-sensitive,C#,Json,Serialization,Deserialization,Case Sensitive,我试图将字符串内容反序列化为对象,但我希望内容区分大小写。只有当字符串具有小写属性时,代码才会成功;如果字符串具有大写属性,代码才会失败。课程内容如下: internal class ResponseList { [DataMember] [JsonProperty] internal List<Response> Value { get; set; } } internal class Response { [DataMember] [Js

我试图将字符串内容反序列化为对象,但我希望内容区分大小写。只有当字符串具有小写属性时,代码才会成功;如果字符串具有大写属性,代码才会失败。课程内容如下:

internal class ResponseList
{
    [DataMember]
    [JsonProperty]
    internal List<Response> Value { get; set; }
}

internal class Response
{
    [DataMember]
    [JsonProperty]
    internal string Id { get; set; }

    [DataMember]
    [JsonProperty]
    internal string Location { get; set; }

    [DataMember]
    [JsonProperty]
    internal PlanClass Plan { get; set; }
}

internal class PlanClass
{
    [DataMember]
    [JsonProperty]
    internal string Name { get; set; }

    [DataMember]
    [JsonProperty]
    internal string Product { get; set; }

    [DataMember]
    [JsonProperty]
    internal string Publisher { get; set; }
}
只有在内容为以下情况下,代码才会成功:

{
  "value": [
    {
      "id": "id1",
      "location": "location1",
      "plan": {
        "name": "free",
        "product": "product1",
        "publisher": "publisher1"
      }
    }
    ]
}
即使其中一个键为大写,也会失败。例如

{
  "value": [
    {
      "Id": "id1",
      "Location": "location1",
      "plan": {
        "Name": "free",
        "product": "product1",
        "publisher": "publisher1"
      }
    }
    ]
}
请注意,只有键/属性名称应为小写。值可以是大写。
有没有办法使JsonConvert.Deserializeobject区分大小写

您可以编写自定义转换器来处理此用例。关于递归检查所有键名的需要,我使用了

var json=@“{”id“:”id1“,”name“:”name1“,”type“:”type1“}”;
var json2=@“{”id“:”id1“,”Name“:”name1“,”type“:”type1“}”;
JsonSerializerSettings设置=新建JsonSerializerSettings()
{
ContractResolver=新的CamelCasePropertyNamesContractResolver(),
转换器=新列表{new CamelCaseOnlyConverter()}
};
var response=JsonConvert.DeserializeObject(json,设置);
var response2=JsonConvert.DeserializeObject(json2,设置);
公共类CamelCaseOnlyConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
返回true;
}
公共重写对象ReadJson(JsonReader reader,类型objectType,
对象存在值,JsonSerializer序列化程序)
{
if(reader.TokenType==JsonToken.Null)
返回null;
var token=(JObject)JToken.Load(reader);
var isCamelCased=真;
WalkNode(令牌,空,
t=>
{
var nameFirstChar=t.Name[0].ToString();
如果(!nameFirstChar.Equals)(nameFirstChar.ToLower(),
StringComparison.CurrentCulture)
{
isCamelCased=假;
返回;
}
});
如果(!isCamelCased)返回null;
返回token.ToObject(objectType);
}
公共重写void WriteJson(JsonWriter writer,对象值,
JsonSerializer(序列化程序)
{
JObject o=(JObject)JToken.FromObject(值);
o、 书面(作者);
}
专用静态void WalkNode(JToken节点,
Action objectAction=null,
Action propertyAction=null)
{ 
if(node.Type==JTokenType.Object)
{
if(objectAction!=null)objectAction((JObject)节点);
foreach(node.Children()中的JProperty子级)
{
如果(propertyAction!=null)propertyAction(子级);
WalkNode(child.Value、objectAction、propertyAction);
}
}
else if(node.Type==JTokenType.Array)
foreach(在node.Children()中的JToken子节点)
WalkNode(子节点、objectAction、propertyAction);
}
}

第一个字符串将返回水合对象。第二个字符串将提前终止,返回null。

@Romonov sure thing。更新后的答案将正确拒绝第二个字符串。这非常有效@罗蒙诺夫太棒了,很乐意帮忙:)
{
  "value": [
    {
      "Id": "id1",
      "Location": "location1",
      "plan": {
        "Name": "free",
        "product": "product1",
        "publisher": "publisher1"
      }
    }
    ]
}
var json = @"{""id"": ""id1"",""name"": ""name1"",""type"": ""type1""}";
var json2 = @"{""id"": ""id1"",""Name"": ""name1"",""type"": ""type1""}";

JsonSerializerSettings settings = new JsonSerializerSettings()
{
    ContractResolver = new CamelCasePropertyNamesContractResolver(),
    Converters = new List<JsonConverter> { new CamelCaseOnlyConverter() }
};

var response = JsonConvert.DeserializeObject<Response>(json, settings);
var response2 = JsonConvert.DeserializeObject<Response>(json2, settings);

public class CamelCaseOnlyConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, 
        object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;

        var token = (JObject)JToken.Load(reader);

        var isCamelCased = true;
        WalkNode(token, null,
        t =>
        {
            var nameFirstChar = t.Name[0].ToString();
            if (!nameFirstChar.Equals(nameFirstChar.ToLower(), 
                StringComparison.CurrentCulture))
            {
                isCamelCased = false;
                return;
            }
        });

        if (!isCamelCased) return null;

        return token.ToObject(objectType);
    }

    public override void WriteJson(JsonWriter writer, object value, 
        JsonSerializer serializer)
    {
        JObject o = (JObject)JToken.FromObject(value);
        o.WriteTo(writer);
    }

    private static void WalkNode(JToken node,
                            Action<JObject> objectAction = null,
                            Action<JProperty> propertyAction = null)
    { 
        if (node.Type == JTokenType.Object)
        {
            if (objectAction != null) objectAction((JObject)node);
            foreach (JProperty child in node.Children<JProperty>())
            {
                if (propertyAction != null) propertyAction(child);
                WalkNode(child.Value, objectAction, propertyAction);
            }
        }
        else if (node.Type == JTokenType.Array)
            foreach (JToken child in node.Children())
                WalkNode(child, objectAction, propertyAction);
    }
}