用于检查匿名类型的 JSON 字符串的 C# 通用实用程序
C# generic utility to check JSON string for anonymous type
我有一个 JSON 字符串。我想检查它是否包含匿名对象。如果是,则 return 值。如果没有,那么 return 一个默认值。然后我希望能够为不同的匿名对象重复多次。
这是我目前实现的代码示例,但显然每次都是重复的,而且不是很 "clean"。
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;
}
var displayDataBy = 0;
…..
displayDataBy = (displayDataByResult?.DisplayDataBy?.Value == null ? displayDataBy : displayDataByResult.DisplayDataBy.Value);
var xMinsOeeToShow = 480;
…...
xMinsOeeToShow = (xMinsOeeToShowResult?.XMinsOeeToShow?.Value == null ? xMinsOeeToShow : xMinsOeeToShowResult.XMinsOeeToShow.Value);
希望对您有所帮助。
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;
}
为什么不使用 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);
有了这个,您可以通过 Json 路径遍历 Json 并设置默认值。无需声明匿名类型。
是否需要明确知道您要检索的 JSON 的 属性?
使用助手 class 概括您正在执行的操作,
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
设置显式类型,但我被迫假设它是允许 null
returns 来自成员访问器 lambda。如果可能返回 class,则需要使用 class 助手。
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...
方法。
我有一个 JSON 字符串。我想检查它是否包含匿名对象。如果是,则 return 值。如果没有,那么 return 一个默认值。然后我希望能够为不同的匿名对象重复多次。
这是我目前实现的代码示例,但显然每次都是重复的,而且不是很 "clean"。
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;
}
var displayDataBy = 0;
…..
displayDataBy = (displayDataByResult?.DisplayDataBy?.Value == null ? displayDataBy : displayDataByResult.DisplayDataBy.Value);
var xMinsOeeToShow = 480;
…...
xMinsOeeToShow = (xMinsOeeToShowResult?.XMinsOeeToShow?.Value == null ? xMinsOeeToShow : xMinsOeeToShowResult.XMinsOeeToShow.Value);
希望对您有所帮助。
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;
}
为什么不使用 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);
有了这个,您可以通过 Json 路径遍历 Json 并设置默认值。无需声明匿名类型。
是否需要明确知道您要检索的 JSON 的 属性?
使用助手 class 概括您正在执行的操作,
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
设置显式类型,但我被迫假设它是允许 null
returns 来自成员访问器 lambda。如果可能返回 class,则需要使用 class 助手。
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...
方法。