首页 新闻 搜索 专区 学院

请问怎么检索json中重复的数据

0
悬赏园豆:50 [已解决问题] 解决于 2015-05-04 22:48

请问如果我有这样一个json:

[{"ID":1,"Data":{"subjectCode":"1","subjectName":"1","subjectType":"1","componentFormat":"2"}},{"ID":2,"Data":{"subjectCode":"2","subjectName":"2","subjectType":"1","componentFormat":"2"}},{"ID":4,"Data":{"subjectCode":"1","subjectName":"1","subjectType":"1","componentFormat":"2"}}]

我要判断Data里面是否有重复的怎么办啊?就是判断每个ID里面的Data会不会和其他ID里的Data重复。。。

临冰听雪丶的主页 临冰听雪丶 | 初学一级 | 园豆:4
提问于:2015-05-04 16:59
< >
分享
最佳答案
0

本质就是字符串的比较嘛。

收获园豆:40
Firen | 大侠五级 |园豆:5483 | 2015-05-04 18:31

可否说的详细一些,或者给一个解决方法,谢谢。。。

临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-04 18:39

@临冰听雪丶: 首先确定你是用什么语言处理这JSON?

Firen | 园豆:5483 (大侠五级) | 2015-05-04 18:52

@Firen: 前台js最好,当然NET后台也可以

临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-04 19:12

@临冰听雪丶: 

Firen | 园豆:5483 (大侠五级) | 2015-05-04 19:35

@临冰听雪丶: c# 代码

Firen | 园豆:5483 (大侠五级) | 2015-05-04 19:35

@Firen: 嗯嗯,谢谢了,嘿嘿

临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-04 22:46

@临冰听雪丶: 

不应该这样写吧 

你的这个对象明显是 id是唯一的

换句话说 只要比较id是否重复就好了 

 

第二 目前的做法是比较对象是否重复 用的循环比较 如果你有300个对象呢 那么计算次数不是 300*300么

很快就会当机的 

所以我建议你用dictionary 这样的话 时间复杂度最低

小眼睛老鼠 | 园豆:2774 (老鸟四级) | 2015-05-06 17:30

@小眼睛老鼠: 1我的ID虽然是唯一的,但是我需要的是数据的重复。因为ID其实是我在push js的时候一个自增而已。

2你说的字典,我不是很明白要怎么做,一个个添加到字典中吗?

临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-07 22:01

@小眼睛老鼠: 我感觉,循环的速度,应该还算可以吧

临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-07 22:06
其他回答(7)
0

你的Data就个json你怎么判断,至少判断其中一个属性把 比如subjectName

Cyclone77 | 园豆:36 (初学一级) | 2015-05-04 17:14

我要判断每一列,Data中的每一项,只要有其中一项不同,就返回true,比如ID1的和ID2的里面的Data全部相同的话,就返回一个false,只要有一项不同就返回true。

支持(0) 反对(0) 临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-04 17:18
0
FreeSaber | 园豆:85 (初学一级) | 2015-05-04 17:33

遍历之后呢?我json这块不是很好。。。您能大概给我举个例子吗?感激不尽。。。

支持(0) 反对(0) 临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-04 17:44

@临冰听雪丶: 或者,你直接将json数据,post到服务器,将json数据转到list中,用linq可以方便的进行分组。将分组统计大于1的ID返回给客户端就行了。

支持(0) 反对(0) FreeSaber | 园豆:85 (初学一级) | 2015-05-04 17:54

@FreeSaber: linq没怎么接触。。。转换list我会,请问是用linq分组统计要怎么写啊?

支持(0) 反对(0) 临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-04 18:03
0

你这问题二义性是有的,如果在后台用NET就比较好办,如果在前端用JAVASCRIPT是麻烦一点。

爱编程的大叔 | 园豆:30664 (高人七级) | 2015-05-04 17:51

也可以把这些数据使用ajax的方式发在后台验证然后再返回。那如果在后台用NET的话,需要怎么做呢?

支持(0) 反对(0) 临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-04 18:01
0

1、你说的重复是整条数据还是数据里的某些字段

2、如果是整条数据可以在输出的时候时候使用迭代方式判断 < java hashmap<key,value>>,如果是某些字段也可以采用比较的方式.

维客 | 园豆:204 (菜鸟二级) | 2015-05-04 17:55

1/subjectName/subjectType/componentFormat就这三个主要的字段就可以

2/您可以给我写个大概的例子吗?js我不是很熟。您这样说我不知道该如何下手。。。

支持(0) 反对(0) 临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-04 18:02
0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Runtime.Serialization;
using System.Web.Script.Serialization;
using System.Collections;

namespace ConsoleApplication6
{


    public class C
    {
        public List<A> list;
    }
    public class A:IEqualityComparer<A>
    {
        public string ID;
        public B Data;

        public bool Equals(A x, A y)
        {
            if (x.Data.subjectCode.Equals(y.Data.subjectCode)
                && x.Data.subjectName.Equals(y.Data.subjectName)
                && x.Data.subjectType.Equals(y.Data.subjectType)
                && x.Data.componentFormat.Equals(y.Data.componentFormat))
            {
                return true;
            }
            return false;
        }

        public int GetHashCode(A obj)
        {
            return obj.ToString().GetHashCode();
        }
    }
    public class B
    {
        public string subjectCode;
        public string subjectName;
        public string subjectType;
        public string componentFormat;
    }
    class Program
    {
        static void Main(string[] args)
        {


            string str = "{\"list\":[{\"ID\":1,\"Data\":{\"subjectCode\":\"1\",\"subjectName\":\"1\",\"subjectType\":\"1\",\"componentFormat\":\"2\"}},{\"ID\":2,\"Data\":{\"subjectCode\":\"2\",\"subjectName\":\"2\",\"subjectType\":\"1\",\"componentFormat\":\"2\"}},{\"ID\":4,\"Data\":{\"subjectCode\":\"1\",\"subjectName\":\"1\",\"subjectType\":\"1\",\"componentFormat\":\"2\"}}]}";
            JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();
            C a= jsonSerialize.Deserialize<C>(str);

            List<A> list= a.list;
            var listB = list.Distinct();


            //找到非重复的项
            foreach (var item in listB)
            {
                Console.WriteLine(item.ID);
            }
            
        }
    }
}
收获园豆:10
田麦成 | 园豆:1984 (小虾三级) | 2015-05-04 18:09

我运行出来的结果事故124,可是1和4不是重复的吗?

支持(0) 反对(0) 临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-04 18:27

@临冰听雪丶: 我写错了一行代码:

string str = "{\"list\":[{\"ID\":1,\"Data\":{\"subjectCode\":\"1\",\"subjectName\":\"1\",\"subjectType\":\"1\",\"componentFormat\":\"2\"}},{\"ID\":2,\"Data\":{\"subjectCode\":\"2\",\"subjectName\":\"2\",\"subjectType\":\"1\",\"componentFormat\":\"2\"}},{\"ID\":4,\"Data\":{\"subjectCode\":\"1\",\"subjectName\":\"1\",\"subjectType\":\"1\",\"componentFormat\":\"2\"}}]}";
            JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();
            C a= jsonSerialize.Deserialize<C>(str);

            List<A> list= a.list;
            var listB = list.Distinct(new A());


            //找到非重复的项
            foreach (var item in listB)
            {
                Console.WriteLine(item.ID);
            }
支持(0) 反对(0) 田麦成 | 园豆:1984 (小虾三级) | 2015-05-05 09:11

@临冰听雪丶: 这一句应该这样子写:

var listB = list.Distinct(new A());
支持(0) 反对(0) 田麦成 | 园豆:1984 (小虾三级) | 2015-05-05 09:12

@临冰听雪丶: 这一句的意思是 加入去重复的“比较器模板”。

支持(0) 反对(0) 田麦成 | 园豆:1984 (小虾三级) | 2015-05-05 09:16

@田麦成: 噢。。。嘿嘿,谢谢拉,请问使用list的Distinct和循环,哪个执行的效率会比较好呢?

支持(0) 反对(0) 临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-07 22:20
0

js里也有map吧,先find一下,没有就add(insert),有就判重呗

C8LUKA | 园豆:209 (菜鸟二级) | 2015-05-06 10:04

 js我不太知道该如何去操作

支持(0) 反对(0) 临冰听雪丶 | 园豆:4 (初学一级) | 2015-05-07 22:21
0

jquery.linq.js和后台的linq基本一致

Crayon | 园豆:89 (初学一级) | 2015-05-11 07:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册