json转C#对象问题

json转C#对象问题

json转C#对象问题

json转C#对象问题


为什么我直接转json这个变量不行,把json变量里的值转的话就可以。为什么?

回答: json转C#对象问题

  1. 你json里的格式明显不对,哪里来的那么多“\”,转义符在都带进json内容里怎么会对

Jackson能将这种json数组转换为对象吗?

  1. Q
    我在使用jackson转换json时遇到了下面的json数组:
    {"data":[
            [1392072000,[0,14440]],
            [0,13762],
            [0,13901],
            [0,14546],
            [0,14710],
            [0,14730],
            [0,14655],
            [0,14898],
            [0,14772]],
     "meter_id":"disk-os"}

    其中data中的第一项的格式和其他项不一样,导致我不太清楚怎么写java bean类,有哪位大牛能解决此问题?100分奉上!
  2. A
    本地測試過直接用List<Object>就可以了?
    ObjectMapper是jackson-mapper-asl-1.5.4.jar包里的.

    import org.codehaus.jackson.map.ObjectMapper;
    import org.junit.Test;

    import java.util.List;

    /**
     * Created by Leo on 14-3-28.
     */
    public class TestJackSon {
        @Test
        public void test() throws Exception{
            String json = "{\"data\":[\n" +
                    "        [1392072000,[0,14440]],\n" +
                    "        [0,13762],\n" +
                    "        [0,13901],\n" +
                    "        [0,14546],\n" +
                    "        [0,14710],\n" +
                    "        [0,14730],\n" +
                    "        [0,14655],\n" +
                    "        [0,14898],\n" +
                    "        [0,14772]],\n" +
                    " \"meter_id\":\"disk-os\"}";
            JsonBean bean = new ObjectMapper().readValue(json, JsonBean.class);
            System.out.println(bean);
        }
        private static class JsonBean {
            private List<Object> data;

            public List<Object> getData() {
                return data;
            }

            public void setData(List<Object> data) {
                this.data = data;
            }

            public String getMeter_id() {
                return meter_id;
            }

            public void setMeter_id(String meter_id) {
                this.meter_id = meter_id;
            }

            private String meter_id;
        }
    }

json 中对象的转换

  1. Q
    public String toString(){
    String json="{rid:%d,topic:'%s'/*String*/,user:'%s'/*String*/title:'%s',content:'%s',replyTime:'%s',userIp:'%s'}";

    return String.format(json, rid,topic/*主贴对象*/,user/*用户对象*/,title,content,replyTime.toString(),userIp);
    }
    // Fields

    private long rid;
    private Topic topic;//引用类型
    private User user;//引用类型
    private String title;
    private String content;
    private Date replyTime;
    private String userIp;

    topic:'%s' 是String类型的,而topic 是类类型的,如何让他们进行转换,因为可能在其他的类中我需要用到转换后的topic!
    希望高手帮我解决这个问题,如果此方法不行,请告诉我其他方法的详细情况!谢谢
  2. A
    以下是以前写的一段代码,就是JSON串与JAVA对象之间互相转换,使用的Jackson-Json,不管嵌套几层都是OK的。

    Jackson-json网站:http://jackson.codehaus.org/

    import java.io.StringWriter;

    import org.codehaus.jackson.JsonGenerator;
    import org.codehaus.jackson.JsonParser;
    import org.codehaus.jackson.map.MappingJsonFactory;
    import org.codehaus.jackson.type.TypeReference;

    /**
     * JSON转换处理工具类
     * 
     * @created 2011-03-08 09:40:08
     */
    public class JsonUtils {
    	/**
    	 * Object对象转换为JSON格式 
    	 * 
    	 * 例如List对象、JavaBean对象、JavaBean对象数组、Map对象、List Map对象
    	 * @param object 传入的Object对象
    	 * @return object的JSON格式字符串
    	 */
    	public static String toJson(Object object) {
    		
    		// Jackson方式转换为Json
    		MappingJsonFactory f = new MappingJsonFactory(); 
    		StringWriter sw = new StringWriter();
    		
    		try {
    			JsonGenerator generator = f.createJsonGenerator(sw);
    			generator.writeObject(object);
    			generator.close();
    
    		} catch (Exception e) {
    			return "";
    		}
    		return sw.toString();
    		
    	}
    
    	/**
    	 * JSON转换为Object对象
    	 * 
    	 * @param jsonString JSON字符串
    	 * @param c 要转换成的类的类型
    	 * @return Object对象
    	 */
    	public static <T> T jsonToObject(String jsonString, Class<T> c){
    
    		if (jsonString == null || "".equals(jsonString)) {
    			return null;
    
    		} else {
    
    			// Jackson方式将Json转换为对象
    			MappingJsonFactory f = new MappingJsonFactory();
    			try {
    				JsonParser parser = f.createJsonParser(jsonString);
    				return parser.readValueAs(c);
    
    			} catch (Exception e) {
    				return null;
    			}
    		}
    	}
    
    	/**
    	 * 数组格式JSON串转换为ObjectList对象
    	 * @param <T> 
    	 * @param jsonString JSON字符串
    	 * @param tr TypeReference,例如: new TypeReference< List<Album> >(){}
    	 * @return ObjectList对象
    	 */
    	public static <T> T jsonToGenericObject(String jsonString, TypeReference<T> tr){
    
    		if (jsonString == null || "".equals(jsonString)) {
    			return null;
    
    		} else {
    
    			// Jackson方式将Json转换为对象
    			MappingJsonFactory f = new MappingJsonFactory();
    			try {
    				JsonParser parser = f.createJsonParser(jsonString);
    				return parser.readValueAs(tr);
    
    			} catch (Exception e) {
    				return null;
    			}
    		}
    	}
    }

ext tree 如何根据json对象生成节点?

  1. Q

    var jsondata = [ {
                            id: '111',
                            text: '文件夹1_1',

                            children: []
                        },{
                            id: '222',
                            text: '文件夹1_2',
                            children: []
                       }
    ];

     我现在有上面这样一个json格式的对象jsondata,有一个ext tree 对象,tree对象有一个根节点,tree对象的根节点默认不展开,当点击加号展开时,将jsondada加载为其下的子节点。简单点说,ext tree 加载节点的方式通常是请求服务器print一个json格式的字符串,或者请求一个.json文件,而我现在是在页面上有一个json格式的对象,如何能让tree读取这个json对象来生成节点,而不请求任何外部url。我设想的思路是,实际上就是动态加载树节点,但动态请求的不是url,可以是一个方法,返回一个json格式的对象,类似上面的jsondata。ext tree对象有没有这样的实现方式啊,或者有其他的途径可以解决我的需求!


    问题补充:chemzqm 你好,您的回答只是在点击根节点的时候加载一下,我的需求是怎样在点击任何一个节点之前的加号时都可以根据一个已经存在的json对象生成子节点,您还有更全面的方式吗?
  2. A
    配置上去就可以了啊,例如:
    function getJson(){
    var jsondata = [ { 
                            id: '111', 
                            text: '文件夹1_1',
                            children: [] 
                        },{ 
                            id: '222', 
                            text: '文件夹1_2', 
                            children: [] 
                       } 
    ];
    return jsondata ;
    }
    
    ..
    root: new Ext.tree.AsyncTreeNode({
                expanded: false,
                children: [getJson()]
            }),
    

    expanded属性默认是false,这样只有点击结点前加号的时候子节点才会被渲染

Struts2返回到浏览器的Json的文本格式一直带转义过的双引号和反斜杠

  1. Q
    Struts2里面的Action对象的result的String Print出来的结果没有问题
    {"id":"4028efd439422d260139422d2a530000","name":"department"}

    在Struts.xml里面配置的
    <package name="jsons" namespace="/" extends="json-default">
    <action name="jsoninfo" class="personAction">
    <result name="department" type="json">
    <param name="root">result</param>  
    </result>
    </action>
    </package>

    然后再浏览器中输入对应的地址调用
    返回的结果是:
    "{\"id\":\"4028efd439422d260139422d2a530000\",\"name\":\"department\"}"

    说明返回成果,但是文本的格式我用Jquery 的json完全不能解析这样子格式的对象,如果当做string类型来拆分过滤掉引号和反斜杠岂不有些多此一举,我只能想象可能是我哪里没有设置什么,请大家过目。

    在$.ajax中返回的的是正在的JSON格式的对象,我认为是在最后的输出过程中做了一次我不想要的转义,求解。
    例如:
    JSONUtil.serialize(obj.toString());


    我只想在浏览器中得到这样子的结果
    {"id":"4028efd439422d260139422d2a530000","name":"department"}
    问题补充:eval这种客户端转化的过程是我非常不想用的功能函数,浏览器的兼容性和性能也不是非常好,所以我还是期望能直接调用jquery的函数直接能得到正规的JSON格式的文件,不管是$.ajax 还是$.getJSON都能拿到JSON而不是无法辨认的对象。当然不通过eval方式。说白了就是在服务器端解决这个问题,还得用Struts。
  2. A
    你可以看一下jQuery内部实现:

    parseJSON: function( data ) {
    		if ( typeof data !== "string" || !data ) {
    			return null;
    		}
    
    		// Make sure leading/trailing whitespace is removed (IE can't handle it)
    		data = jQuery.trim( data );
    		
    		// Make sure the incoming data is actual JSON
    		// Logic borrowed from http://json.org/json2.js
    		if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
    			.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
    			.replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
    
    			// Try to use the native JSON parser first
    			return window.JSON && window.JSON.parse ?
    				window.JSON.parse( data ) :
    				(new Function("return " + data))();
    
    		} else {
    			jQuery.error( "Invalid JSON: " + data );
    		}
    	},



    1、如果你有JSON parse 就用它来进行解析:http://www.json.org/js.html
    2、否则 (new Function("return " + data))();

    这里注意data一定是字符串的,也就是说struts2传给前端的数据没有错,你要认识到这点;


    eval函数是浏览器内置的,它可以编译和执行任何javascript代码,因此相对来说不太安全,因此jQuery没有使用的:
    引用The eval function is very fast. However, it can compile and execute any JavaScript program, so there can be security issues.

动态拼接JSON数组的问题

  1. Q
    比如说var level = [["ID","NAME"]];
    var newArray = new Array();
    newArray.push({\""+level[0][0]+"\":"000"});

    在往newArray这个数组中插入新的JSON类型的对象就会报无效字符的错误。求教各位大侠!
    问题补充:antiwise 写道newArray.push({level[0][0]:"000"});
    js 不是java不用转义

    感谢你的回复,但是JSON数组的要求很严格,必须使用""框起来,当我去掉转意字符后,又报了缺少":"的错误,请问如何解决呢
    问题补充:clue 写道JS中定义对象时,属性名是常量吧?

    所以,{ a : 1 } 与 { "a" : 1 } 意义相同

    你这里要用这样的办法:

    var o = {};
    o[a] = 1;


    clue动态拼接JSON数组的问题
    非常感谢你的帮助,问题已解决
    问题补充:antiwise 写道clue 写道
    var o = {};
    o[a] = 1;

    呵呵
    这样是对的 因为这是动态给JS对象赋属性
    所以 你的代码应该是
    var level = [["ID","NAME"]]; 
    		var newArray = new Array(); 
    		var o={};
    		o[level[0][0]]='000';
    		newArray.push(o);


    antiwise 动态拼接JSON数组的问题
    感谢你的一贯的支持!问题已经解决。
  2. A
    JS中定义对象时,属性名是常量吧?

    所以,{ a : 1 } 与 { "a" : 1 } 意义相同

    你这里要用这样的办法:

    var o = {};
    o[a] = 1;

JSON调用Struts2的Action出错怎么处理

  1. Q
    问题是这样的,我在页面上通过JQuery来使用JSON来调用action的方法来获得一些数据,用来更新页面上的信息。
    $.getJSON("MyAction_initUsersForGroup?groupId="+groupId,false, function(json){
    .....
    }
    action里面initUsersForGroup方法大概如下:
    Public String initUsersForGroup(){
      try{
         users = dao.getUsersByGroupId(groupId);
      }catch(Exception e){
         logger.error(e);
         throw new BusinessException("something wrong! code=123",e);
      }
       return JSON;
    }

    那么在dao的方法没有抛出异常的时候,页面正常更新了。但是如果dao里面发生了异常,方法抛出去以后,页面那里就得不到任何消息了,即使我把这个exception抛出去了。

    现在想要的效果是,当这个exception发生的时候,能在JSP页面的javascript代码那里得到exception的相关信息,然后组装成一个弹出窗口,请问有办法吗?谢谢了!
  2. A
    可以试一下这个方法:
    后台代码:
    Map<String, Object> result = new HashMap<String, Object>();
                result.put("success", true);
                result.put("msg", "yourExceptionMessage");
                JSONObject json = JSONObject.fromObject(result);
    response.getWriter().print(json);//利用response对象返回给前台
    

jquery, ajax, json

  1. Q
    需要解析的 数据格式
    {
        "status":0,
        "message":"ok",
        "total":4030,
        "results":[
            {
                "name":"成大方圆连锁药店青堆分店",
                "location":{
                    "lat":39.836746,
                    "lng":123.271671
                },
                "address":"双河大街598号附近",
                "detail":1,
                "uid":"7388dffd069db9ebd3ff2363",
                "detail_info":{
                    "tag":"医疗;药店",
                    "type":"hospital",
                    "detail_url":"http://api.map.baidu.com/place/detail?uid=7388dffd069db9ebd3ff2363&output=html&source=placeapi_v2",
                    "price":"0",
                    "overall_rating":"2.9",
                    "service_rating":"0",
                    "technology_rating":"0",
                    "image_num":"1"
                }
            },
            {
                "name":"安康大药房昌盛店",
                "location":{
                    "lat":39.699406,
                    "lng":122.983766
                },
                "address":"延安路芙蓉小区附近",
                "telephone":"(0411)89838258",
                "detail":0,
                "uid":"2a7a25ec5f11c91d6c3e1bf2",
                "detail_info":{
                    "tag":"医疗;药店"
                }
            },

    想要得到name,address,telephone,detail_url等信息。

    前台:
    <script type="text/javascript">
            function GetDrugStoreData() {
                $.ajax({ 
                   type: "post", 
                   url: "http://api.map.baidu.com/place/v2/search?ak=BHYd9MhP6fMWrASjxtEYOGtz&output=json&query=%E8%8D%AF%E6%88%BF&page_size=10&page_num=0&scope=2&region=%E5%A4%A7%E8%BF%9E", 
                   dataType: "json", 
                   success: function (data) { 
                            $("input#showTime").val(data[0].demoData); 
                   }, 
                   error: function (XMLHttpRequest, textStatus, errorThrown) { 
                            alert(errorThrown); 
                   }
                });
            }
    </script>

    后台:
            Dim jsonstr As String = ""
            jsonstr = JsonConvert.SerializeObject(DrugInfo)

            If Request.QueryString("ajax") IsNot Nothing Then
                Dim method As String = ""
                method = Request.QueryString("ajax").ToString().Trim().ToLower()

                If method = "GetDrugStoreData" Then
                    Response.Clear()
                    Response.Write(jsonstr)
                    Response.End()
                End If
            End If

    完全不懂这方面,请大家帮忙。
  2. A
    前台可以将你的json字符串转为对象。。

json格式数据如何存入到java类中?????????

  1. Q
    JSON格式如下:{"idusertype":"200905011","typemsg":"这是我做的测试之一","typename":"测试数据"}
    存入到java类中,不知道怎么处理:

    要存到java类格试如下

    UserType.java
    ---------------------------------------
    package com.xxt.test;

    /**
    * Usertype entity.
    *
    * @author MyEclipse Persistence Tools
    */
    public class Usertype {

    // Constructors
    String idusertype, typename, typemsg;

    public String getIdusertype() {
    return idusertype;
    }

    public void setIdusertype(String idusertype) {
    this.idusertype = idusertype;
    }

    public String getTypename() {
    return typename;
    }

    public void setTypename(String typename) {
    this.typename = typename;
    }

    public String getTypemsg() {
    return typemsg;
    }

    public void setTypemsg(String typemsg) {
    this.typemsg = typemsg;
    }

    }
    ____________________________________

    我通过Ajax传到后台数据,我需要将这些数据存到指定对象中,这个格式的,对过字符串处理也能实现,但这样方法太原始了
  2. A
    你是想要将json转化为对象吧,copy bean?是的话可以考虑用个包,具体怎么实现的,你可以看下
    http://shuaigg-babysky.iteye.com/blog/354516
    你就会明白了,这个包是可以互相转化的!

webservice服务 json格式

  1. Q
    http://localhost:52327/ECA_Service.asmx/Get_BlockSupervisionFile?param={ "userid":"1433","userpwd":"123456"}

    现在需要写一个webservice服务,但是在调用服务的时候需要用以上链接的格式调用(传递的是json格式的对象)。

    如果只是写webservice服务,不限定调用时的格式,我能写。现在需要写成这种格式就不知道怎么写了。

    请教大神给思路。
    如有描述不清楚的,再补充。
  2. A
    我建议你跑去看看“调用服务”的人会不会写代码、会不会调用webservice是传递各种参数。别弄得一个外行给你出了一个错误的 url 设计,等你实现了以后,他有告诉你“根本不知道怎样发出请求、获取结果”。