用于检查匿名类型的JSON字符串的C#泛型实用程序

问题描述 投票:0回答:4

我有一个JSON字符串。我想检查它是否包含匿名对象。如果是,则返回该值。如果没有则返回默认值。然后,我希望能够为不同的匿名对象重复多次。

这是我目前实现的代码示例,但显然每次都重复,而不是非常“干净”。

var displayDataBy = 0;
var displayDataByDefinition = new { DisplayDataBy = new { Key = "string", Value = displayDataBy } };
var displayDataByResult = JsonConvert.DeserializeAnonymousType(this.OhdContentPageParameters, displayDataByDefinition);
try { displayDataBy = displayDataByResult.DisplayDataBy.Value; }
catch { }

var xMinsOeeToShow = 480;
var xMinsOeeToShowDefinition = new { XMinsOeeToShow = new { Key = "string", Value = xMinsOeeToShow } };
var xMinsOeeToShowResult = JsonConvert.DeserializeAnonymousType(this.OhdContentPageParameters, xMinsOeeToShowDefinition);
try { xMinsOeeToShow = xMinsOeeToShowResult.XMinsOeeToShow.Value; }
catch { }

我希望它是一个通用的方法,我可以调用每个匿名类型。不用依赖try / catch也不错。可以吗?

更新中...

这对int,bool和double非常有用:

public static T2 DeserializeValue<T, T2>(this string json, T definition, T2 defaultValue, Func<T, T2?> getValueFunc) where T2 : struct
{
    var jsonAnon = JsonConvert.DeserializeAnonymousType(json, definition);
    return getValueFunc(jsonAnon) ?? defaultValue;
}

我为字符串添加了这个:

public static string DeserializeStringValue<T>(this string json, T definition, string defaultValue, Func<T, string> getValueFunc)
{
    var jsonAnon = JsonConvert.DeserializeAnonymousType(json, definition);
    return getValueFunc(jsonAnon) ?? defaultValue;
}
c# json generics anonymous-objects
4个回答
0
投票

使用帮助程序类来概括您正在执行的操作,

public static class DeserializeHelpers {
    public static T2 DeserializeValue<T,T2>(this string s, T def, T2 defans, Func<T, T2?> getAnsFn) where T2 : struct {
        var jsonAnon = JsonConvert.DeserializeAnonymousType(s, def);
        return getAnsFn(jsonAnon) ?? defans;
    }

    public static T2 DeserializeClass<T,T2>(this string s, T def, T2 defans, Func<T, T2> getAnsFn) where T2 : class {
        var jsonAnon = JsonConvert.DeserializeAnonymousType(s, def);
        return getAnsFn(jsonAnon) ?? defans;
    }
}

您可以按如下方式略微简化代码。我留下了一些冗长的编码,因为你似乎要竭尽全力避免为Value输入一个显式类型,但是我被迫假设它是一个值类型,允许从成员访问器lambda返回null。如果可能返回一个类,则需要使用类助手。

var displayDataBy = 0;
var displayDataByDefinition = new { DisplayDataBy = new { Key = "string", Value = displayDataBy } };
var displayDataByResult = this.OhdContentPageParameters.DeserializeValue(displayDataByDefinition, displayDataBy, x => x.DisplayDataBy?.Value);

var xMinsOeeToShow = 480;
var xMinsOeeToShowDefinition = new { XMinsOeeToShow = new { Key = "string", Value = xMinsOeeToShow } };
var xMinsOeeToShowResult = this.OhdContentPageParameters.DeserializeValue(xMinsOeeToShowDefinition, xMinsOeeToShow, x => x.XMinsOeeToShow?.Value);

我使用Deserialize...的扩展方法,但当然它可以是常规方法。

如果您不需要重用匿名类型定义,则可以将该内联传递给Deserialize...方法。


1
投票

尝试使用条件运算符:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators

var displayDataBy = 0;
…..
displayDataBy = (displayDataByResult?.DisplayDataBy?.Value == null ? displayDataBy : displayDataByResult.DisplayDataBy.Value);


var xMinsOeeToShow = 480;
…...
xMinsOeeToShow = (xMinsOeeToShowResult?.XMinsOeeToShow?.Value == null ? xMinsOeeToShow : xMinsOeeToShowResult.XMinsOeeToShow.Value);

0
投票

我希望这有帮助。

public object GetStuffDone(int displayDataBy, string KeyName, string Ohd, int defaultValue)
        {
            var definition = new { theData = new { Key = KeyName, Value = displayDataBy } };

            var result = JsonConvert.DeserializeAnonymousType(Ohd, definition);


            return result != null ? result.theData.Value : defaultValue;
        }

0
投票

为什么不使用JObject.Parse而不是反序列化?

Func<Type, string, object, string, object> getValue = (T, path, dflt, json) =>
            {
                var jobj = JObject.Parse(json);
                return jobj.SelectToken(path).ToObject(T) ?? dflt;
            };

var result = (int)getValue(typeof(int), "*.Value", 0, this.OhdContentPageParameters);

这样,您可以通过JsonPath遍历Json并设置默认值。无需声明匿名类型。

是否需要明确知道要检索的JSON的属性?

© www.soinside.com 2019 - 2024. All rights reserved.