【问题标题】:How To concatenate Two Json object in Asp.Net如何在 Asp.Net 中连接两个 Json 对象
【发布时间】:2019-05-06 21:24:42
【问题描述】:

如何连接结果Json(new{lstrng,a}, JsonRequestBehavior.AllowGet);。我想看看 lstrng 和 a 的结果。我的代码是

var a = this.abc();  
JsonResult json =Json(new{lstrng,a}, JsonRequestBehavior.AllowGet);  
json.MaxJsonLength = int.MaxValue;  
return json;

这里 abc 是另一种方法,lstrng 是当前方法的结果

public JsonResult gFbrRecord()
    {
        DataSet ds = dblayer.gfbrdata();
        //this is for getordert tart
        List<fbrData> lstrng = new List<fbrData>(10000);
        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            lstrng.Add(new fbrData
            {  
               FBRInvoiceNumber = dr["FBR_NUM"] != DBNull.Value ? Convert.ToString(dr["FBR_NUM"]) : Convert.ToString(""),
                POSID = dr["REG_NUM"] != DBNull.Value ? Convert.ToInt32(dr["REG_NUM"]) : Convert.ToInt32(0),
               });               

        }

        var a = this.abc();                 
        JsonResult json =Json(new{lstrng,a}, JsonRequestBehavior.AllowGet);
        json.MaxJsonLength = int.MaxValue;
        return json;
    }
     public JsonResult abc() {
        DataSet ds = dblayer.gfbrdata();
        List<fbr1> lstrng = new List<fbr1>(10000);
        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            lstrng.Add(new fbr1
            {  
                DetailSerialNo = dr["SRL_NUM"] != DBNull.Value ? Convert.ToInt32(dr["SRL_NUM"]) : Convert.ToInt32(0),                   
                ItemCode = dr["ITM_COD"] != DBNull.Value ? Convert.ToString(dr["ITM_COD"]) : Convert.ToString(""),
              });

        }

        JsonResult json = Json(lstrng, JsonRequestBehavior.AllowGet);
        json.MaxJsonLength = int.MaxValue;
        return json;
    }
}

【问题讨论】:

  • 连接是什么意思?
  • lstrng & a里面的内容是什么?
  • 连接意味着我想得到一个对象的结果只返回一个对象
  • lstrng 是一种方法的结果,a 是另一种方法的结果
  • lstrng 包含数据列表和包含 json 结果

标签: c# asp.net json web asp.net-web-api


【解决方案1】:

您需要查询您的两个列表并从第二个列表中选择多个项目 与第一个列表中的单个项目具有相同的 ID

public JsonResult gFbrRecord()
    {
        DataSet ds1 = dblayer.gfbrdata();
        List<fbrData> lstrng1 = new List<fbrData>(10000);

        //Your other stuff here

        DataSet ds2 = dblayer.gfbrdata();
        List<fbr1> lstrng2 = new List<fbr1>(10000);

        //Your other stuff here

        var result = (from item1 in lstrng1
                      select new
                      {
                          FBRInvoiceNumber = item1.FBRInvoiceNumber,
                          POSID = item1.POSID,
                          SRL_NUM = item1.SRL_NUM,
                          Data = (from item2 in lstrng2
                                  where item2.SRL_NUM == item1.SRL_NUM
                                  select new
                                  {
                                      DetailSerialNo = item2.DetailSerialNo,
                                      ItemCode = item2.ItemCode
                                  }).ToList()
                      }).ToList();

        return Json(result, "application/json", JsonRequestBehavior.AllowGet);
    }

替代方案

基本上,我为您提供了一个示例代码,它应该适用于连接两个 json 对象

1) 该方法从数据库中获取记录并填充列表,然后将从此列表中创建JToken

public static JToken Method1()
{
    DataSet ds = dblayer.gfbrdata();
    List<fbrData> lstrng = new List<fbrData>(10000);

    //Your other stuff here

    JToken jToken = JToken.FromObject(lstrng);
    return jToken;
}

JToken以上方法返回的样子

[
  {
    "FBRInvoiceNumber": "ABC",
    "POSID": 110034,
    "SRL_NUM": 123
  },
  {
    "FBRInvoiceNumber": "PQR",
    "POSID": 210035,
    "SRL_NUM": 456
  }
]

2) 这个方法也和上面的方法一样,唯一的区别是这个方法是从数据库中获取记录,而不是上面的方法。

public static JToken Method2()
{
    DataSet ds = dblayer.gfbrdata();
    List<fbr1> lstrng = new List<fbr1>(10000);

    //Your other stuff here

    JToken jToken = JToken.FromObject(lstrng);
    return jToken;
}

JToken以上方法返回的样子

[
  {
    "DetailSerialNo": 8,
    "ItemCode": "700275",
    "SRL_NUM": 123
  },
  {
    "DetailSerialNo": 9,
    "ItemCode": "800279",
    "SRL_NUM": 456
  }
]

3) 现在下面的函数可以在同一索引上连接两个数组中的每个对象。

既然你在上面的评论中提到

您想通过相同的属性键 SRL_NUM 值连接两个数组中的每个对象。

public static JToken Concat(JToken jToken1, JToken jToken2)
{
    JArray jArray = new JArray();

    foreach (JObject jObject1 in jToken1.ToObject<JArray>())
    {
        var value1 = jObject1.Properties().Where(x => x.Name == "SRL_NUM").FirstOrDefault().Value;

        foreach (JObject jObject2 in jToken2.ToObject<JArray>())
        {
            var value2 = jObject2.Properties().Where(x => x.Name == "SRL_NUM").FirstOrDefault().Value;

            if (Convert.ToInt32(value1) == Convert.ToInt32(value2))
            {
                jObject1.Merge(jObject2, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Concat });
                jArray.Add(jObject1);
            }
        }
    }

    return jArray;
}

4) 然后你可以使用上面的方法来你的操作方法

public ContentResult gFbrRecord()
{
    JToken jToken1 = Method1();
    JToken jToken2 = Method2();

    var result = Concat(jToken1, jToken2);

    return Content(result.ToString(), "application/json");
}

输出:

编辑1:

如果您的数组在第二个数组中包含多个SRL_NUM,则以下方法可以将具有相同SRL_NUM 的所有项与具有相同SRL_NUM 的第一个数组项连接起来。

public static JToken Concat(JToken jToken1, JToken jToken2)
{
    JArray jArray = new JArray();

    foreach (JObject jObject1 in jToken1.ToObject<JArray>())
    {
        var value = jObject1.Properties().Where(x => x.Name == "SRL_NUM").FirstOrDefault().Value;

        var result = jToken2.ToObject<JArray>().ToObject<JObject[]>().Properties().Where(x => x.Name == "SRL_NUM" && Convert.ToInt32(x.Value) == Convert.ToInt32(value)).Select(x => x.Parent);

        JArray jAr = new JArray();

        foreach (JObject obj in result)
        {
            jAr.Add(obj);
        }

        JObject jObject = new JObject();

        jObject.Merge(jObject1, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Concat });
        jObject.Add("Data", jAr);

        jArray.Add(jObject);
    }

    return jArray;
}

输出:

【讨论】:

  • 感谢兄弟的出色工作,直到 jason 返回时,我一切正常,但是当我在邮递员上显示结果时没有显示任何内容,只是显示空数组,但在 API 中显示值
  • 这是 HTTPGET api 对吗?然后用浏览器试试。如果它向您显示结果,则 API 工作正常。然后尝试使用邮递员并管理一些设置,例如从下拉列表中选择 JSON 选项。
  • 爱你的兄弟非常感谢你的关心和巨大的努力和帮助。这让我很开心
  • 我想要你上面提到的相同的输出,但这里我得到的是空数组
  • 先生,我的记录只是重复,除了这个一切都好
【解决方案2】:

我猜你只是想要一个 list 的结果只是合并 a 和 lstrng??
a.Data.AddRang(lstrng.Data) 此代码将合并 arr 两者,您需要在 lstrng 模型中定义 a.Data 列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多