【问题标题】:Creating an anonymous object who must have the dot in Key name and put it inside another anonymous object创建一个匿名对象,该对象必须在键名中包含点并将其放在另一个匿名对象中
【发布时间】:2019-11-15 11:24:42
【问题描述】:

我正在为elasticsearch 查询创建JSON body

我有这个dynamic

var hlBodyText = new
{
  bodyText = new { }
};

但是有一种情况,名字必须是bodyText.exact = new { },但显然我不允许这样做并返回错误信息:

Invalid anonymous type member declarator. Anonymous type members must be declared with a member assignment, simple name or member access.

有一种方法可以使用dot char 来命名该值?

编辑

此外,我必须把这个对象放在另一个对象中,像这样:

var fieldsInner = new
{
  hlBodyText.bodyText
};

除了用点设置属性名称之外,获得此结果的最佳方法是什么?

编辑#2

我用我的所有参数创建了一个class,因为我认为JsonProperty attribute 可以帮助我。

internal class ElasticSearchHighlightsModel
{
  [JsonProperty("bodyText")]
  public object bodyText { get; set; }
  [JsonProperty("title")]
  public object title { get; set; }
  [JsonProperty("shortDescription")]
  public object shortDescription { get; set; }

  [JsonProperty("bodyText.exact")]
  public object bodyTextExact { get; set; }
  [JsonProperty("title.exact")]
  public object titleExact { get; set; }
  [JsonProperty("shortDescription.exact")]
  public object shortDescriptionExact { get; set; }
}

然后在我的方法中,我有一个条件,我必须使用一些参数或其他参数。

// ...some code...
else
{
  var hlBodyText = new ElasticSearchHighlightsModel() { bodyTextExact = new { } };
  var hlTitle = new ElasticSearchHighlightsModel() { titleExact = new { } };
  var hlShortDescription = new ElasticSearchHighlightsModel() { shortDescriptionExact = new { } };

  var fieldsInner = new
  {
    hlBodyText.bodyTextExact,
    hlTitle.titleExact,
    hlShortDescription.shortDescriptionExact,
  };

  var fieldsContainer = new
  {
    pre_tags = preTags,
    post_tags = postTags,
    fields = fieldsInner,
  };
  return fieldsContainer;
}

fieldsInner 对象有参数名称(bodyTextExact、titleExact 等...),而不是 JsonProperty attribute 的。

【问题讨论】:

  • 如何将其转换为 Json?
  • 我不转换它,这是我使用Flurl发送给ES的一个大对象的一小部分
  • dynamic 不是类型。这是局部变量还是类属性?如果它是一个属性,您可以使用JsonProperty attribute
  • @DStanley 是一个局部变量。也许创建一个具有属性的类会有所帮助

标签: c# asp.net-mvc anonymous-types anonymous-class


【解决方案1】:

看来你正在寻找这个,稍后你将字典转换为 json

Dictionary<string,object> obj=new Dictionary<string,object>();

obj["bodyText.exact"]=new object{};

【讨论】:

  • 这是个好主意,但对我来说这可能还不够。我添加了一些关于问题的信息
【解决方案2】:

已解决使用Dictionary,然后将其传递给anonymous type obj

IDictionary highlitsFieldsContainer = new Dictionary<string, object>();
// ... some code
highlitsFieldsContainer["bodyText.exact"] = new { };
highlitsFieldsContainer["title.exact"] = new { };
var fieldsContainer = new
{
  fields = highlitsFieldsContainer,
};

// OUTPUT: fieldsContainer = { fields = { bodyText.exact = {}, title.exact = {} } }

elasticsearch 发送他的响应时,使用RouteValueDictionary class 读取该值。

RouteValueDictionary _res = new RouteValueDictionary(dynamicResponse.highlights);
if (_res["shortDescription.exact"] != null)
{ 
  // ...
}

【讨论】:

    【解决方案3】:

    您似乎正在创建一个匿名类型(不是“动态”)并希望使用在 C# 中无效的不同名称对其进行序列化。为此,您需要使用命名类型并使用 JsonProperty 属性:

    internal class HlBodyText 
    {
        [JsonProperty("bodyText.exact")]
        public DateTime bodyText { get; set; }
    }
    

    并创建它的一个实例:

    var hlBodyText = new HlBodyText() 
    {
      bodyText = new { }
    };
    

    【讨论】:

    • 还没有工作。 fieldsInner 对象没有 JsonParams attribute 值,而是直接有 class parameter 名称。
    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多